在const成员函数中强制的去掉const

来源:互联网 发布:下列变量不是c语言的 编辑:程序博客网 时间:2024/04/27 13:09
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。
0 0
原创粉丝点击