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

本文探讨了C++中如何通过const关键字制造看似不可变但实际上可变的常量对象,解释了这种技巧的应用场景及潜在风险,并通过实例展示了如何在不同情况下实现这一效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值