- const修饰成员函数的作用:
- 保证对象状态不变:const修饰的成员函数承诺不会修改调用该函数的对象的成员变量(除非成员变量被声明为mutable)。这有助于维护对象的常量性,提高代码的安全性和可维护性。例如,对于一个表示只读数据的对象,通过将其成员函数声明为const,可以确保在调用这些函数时对象的状态不会被意外改变。
- 编译器保证这种特性的实现方式:
- 隐式传递this指针:在C++中,成员函数实际上有一个隐式的
this
指针参数,指向调用该函数的对象。当成员函数被声明为const时,this
指针的类型实际上是const ClassName*
,而不是普通的ClassName*
。这意味着在const成员函数内部,不能通过this
指针修改对象的成员变量(除非成员变量是mutable),因为this
指针指向的是一个常量对象。如果试图在const成员函数中修改非mutable成员变量,编译器会报错。
- 一个const对象不可以调用非const成员函数:
- 原因:非const成员函数有可能修改对象的状态,而const对象代表其状态应该是不可变的。如果允许const对象调用非const成员函数,就会违背const对象的常量性原则。编译器会阻止这种调用,因为非const成员函数的
this
指针类型是普通的ClassName*
,而const对象的this
指针类型是const ClassName*
,类型不匹配。例如:
class MyClass {
public:
void nonConstFunction() {
// 可以修改成员变量
}
void constFunction() const {
// 不能修改非mutable成员变量
}
};
int main() {
const MyClass obj;
// obj.nonConstFunction(); // 编译错误,const对象不能调用非const成员函数
obj.constFunction(); // 合法,const对象可以调用const成员函数
return 0;
}