面试题答案
一键面试使用const关键字保护对象状态的原因
- 数据完整性:防止成员函数意外修改对象的成员变量,确保对象的状态在调用该函数期间保持不变,维护数据的完整性。这对于只读操作非常重要,例如获取对象的属性值。
- 接口清晰性:在类的接口层面明确告知调用者该函数不会修改对象的状态,增强代码的可读性和可维护性。调用者可以放心调用该函数,不用担心对象状态被改变。
- 支持const对象调用:如果一个对象被声明为const,只有声明为const的成员函数才能被调用。这样可以保证const对象的状态不会被意外修改。
const成员函数中修改成员变量导致编译错误的示例
#include <iostream>
class MyClass {
private:
int data;
public:
MyClass(int value) : data(value) {}
// const成员函数
int getData() const {
// 下面这行代码会导致编译错误
// data = 10; // error: assignment of member 'MyClass::data' in read-only object
return data;
}
};
int main() {
MyClass obj(5);
const MyClass constObj(10);
std::cout << "obj.getData(): " << obj.getData() << std::endl;
std::cout << "constObj.getData(): " << constObj.getData() << std::endl;
return 0;
}
在上述代码中,getData
是一个 const
成员函数,试图在该函数中修改 data
成员变量会导致编译错误。因为 const
成员函数承诺不修改对象的状态,而修改成员变量违反了这一承诺。如果取消注释 data = 10;
这行代码,编译时会提示 “assignment of member 'MyClass::data' in read-only object” 的错误信息。