我们知道类里面的const的成员函数一般是不允许改变类对象的,但是我们知道const 类型的指针是可以强制类型转出成非const指针的,同样的道理,this指针也可以被强制类型转换

 class Y{
int i;
public:
Y();
void f()const; }; Y::Y(){ i=;
} void Y::f()const{ //i++; 此时是错误的,因为此时this的指针类型是const Y* const this
((Y*) this)->i++;
(const_cast<Y*>(this))->i++; } int main(){ const Y yy;
yy.f(); }

虽然上述用法可以实现const成员函数改变const对象,但是这种用法是客户端程序员是非常不友好的,因为客户端程序员不知道const成员函数是否可以改变const对象,对客户端程序员在接口处没有任何提示。除非客户端程序员可以看到const成员函数的源代码,否则无法判断const成员函数是否可以改变const对象

而最好的办法是在类声明里面使用关键字mutable,以指定一个特定的成员函数可以在一个const对象里被改变

 class Z{
int i;
mutable int j;//被mutable 修饰,可以在const成员函数里面被改变
public:
Z();
void f()const; }; Z::Z():i(),j(){} void Z::f()const{ //i++; 没有使用mutable修饰,不可以改变
j++; }
05-11 02:22