【发布时间】:2011-04-13 22:55:50
【问题描述】:
我今天在重读 c++ 入门(第 4 版)——关于成员函数和 const 引用等的部分,我想出了这个奇怪的小程序:
using std::cout;
using std::endl;
class ConstCheater
{
public:
ConstCheater(int avalue) : ccp(this), value(avalue) {}
ConstCheater& getccp() const {return *ccp;}
int value;
private:
ConstCheater* ccp;
};
int main()
{
const ConstCheater cc(7); //Initialize the value to 7
cout << cc.value << endl;
cc.getccp().value = 4; //Now setting it to 4, even though it's const!
cout << cc.value << endl;
cc.value = 4; //This is illegal
return 0;
}
我的问题是 - 为什么 c++ 允许这样的语法?为什么我可以在声明为 const 的类中编辑普通数据成员? const的要点不就是让你不能修改值吗?
【问题讨论】:
-
您可以绕过 C++ 的大多数安全机制,因为该语言的基础是程序员非常清楚自己在做什么。在我看来,您的程序几乎不像是“意外”。如果你绝对想在脚上开枪,那就去做吧。 C++ 不会阻止你。
-
@FredOverflow,在这种情况下很明显,因为他试图让它变得明显,但即使很清楚为什么会发生这种情况,它仍然是一个有趣的概念问题需要解决,因为可以想象这会以一种错综复杂的方式偶然发生。
标签: c++ class reference constants