C++关心的是去掉偶然的错误而不是防止刻意的欺骗。也就是说我们可以通过“强制去掉const”来做出一个骗局。
就是让一些对象在用户看起来是常量,而事实上他们的状态是可以改变的,这种技巧有时是有用的。这样的类可以通过显式写出来。
例如:
#include <iostream>
class C
{
public :
int g() const
{
((C *)this)->x = 100;
return x;
}
public :
int x;
};
int main()
{
const C c;
std::cout <<"x of C is " << c.g() << std::endl;
system("PAUSE");
return 0;
}
改变一个const对象可能不太可靠,在某些上下文中容易出错。如果对象位于只读存储器中,那么根本无法工作。一般来说,更好的方式是将这种对象的可变部分描述成另一个独立的对象。
例如:
#include <iostream>
class C
{
public :
int g() const
{
((C *)this)->x = 100;
return x;
}
public :
int x;
};
class CC
{
public :
CC():x(*new int)
{
x = 0;
}
~CC()
{
delete &x;
}
public :
int g() const
{
x = 1024;
return x;
}
public :
int &x;
};
int main()
{
const C c;
std::cout <<"x of C is " << c.g() << std::endl;
const CC cc;
std::cout << "x of CC is " << cc.g() << std::endl;
system("PAUSE");
return 0;
}
如果还不是很懂,那就看下面一个例子:
#include <iostream>
class C
{
public :
int g() const
{
((C *)this)->x = 100;
return x;
}
public :
int x;
};
class CC
{
public :
CC():x(new int)
{
}
public :
int g() const
{
//x = 0; // error : x cannot be changed
*x = 1024;
return *x;
}
public :
int *x;
};
int main()
{
const C c;
std::cout <<"x of C is " << c.g() << std::endl;
const CC cc;
std::cout << "x of CC is " << cc.g() << std::endl;
system("PAUSE");
return 0;
}
对于指针来说,const对象只是针对指针的值,让指针的值不能被修改,但是指针所指向的内容还是可以修改的。也就是说这是个顶层const。