面试题答案
一键面试- const成员函数维护类型安全的方式
- 在C++中,
const
成员函数承诺不会修改调用它的对象的状态(除了mutable
修饰的成员变量)。编译器会强制实施这一承诺,从而维护类型安全。当一个对象被声明为const
时,只能调用其const
成员函数,这样可以确保在对象被视为常量的情况下,不会意外修改其状态,避免数据被无意篡改。
- 在C++中,
- const成员函数不能修改成员变量(除
mutable
修饰的)的原因const
成员函数的this
指针是一个指向const
对象的指针(即const ClassName* const this
)。这意味着this
指向的对象在函数内部被视为常量,不能对其进行修改。如果允许const
成员函数修改非mutable
成员变量,就会违背const
对象不可变的原则,破坏类型安全。
- 与类型安全的内在联系
- 类型安全要求对象的状态在特定情况下保持一致性和完整性。
const
成员函数通过限制对对象状态的修改,确保const
对象在使用过程中始终保持其常量特性,避免因意外修改导致程序逻辑错误,从而维护了类型安全。
- 类型安全要求对象的状态在特定情况下保持一致性和完整性。
- 具体的类定义和成员函数实现示例
class Example {
private:
int data;
mutable int mutableData;
public:
Example(int value) : data(value), mutableData(0) {}
int getData() const {
// data = 10; // 编译错误,const成员函数不能修改非mutable成员变量
mutableData = 10; // 合法,mutable成员变量可以在const成员函数中修改
return data;
}
void setData(int value) {
data = value;
}
};
在上述代码中,Example
类有一个普通成员变量data
和一个mutable
成员变量mutableData
。getData
函数是一个const
成员函数,它不能修改data
,但可以修改mutableData
。如果试图在getData
函数中修改data
,编译器会报错,这正是通过编译器强制类型安全的体现。而setData
函数不是const
成员函数,可以修改data
。如果一个const Example
对象调用setData
函数,编译器也会报错,因为setData
函数会修改对象状态,不符合const
对象的使用规则,进一步维护了类型安全。