我仍然很困惑为什么该程序可以编译。我试图就这个问题发表我的看法,我不知道为什么它被删除了。所以我不得不再次问这个问题。
这是程序
class Cheater
{
public:
Cheater(int avalue) :
value(avalue),
cheaterPtr(this) //conceptually odd legality in const Cheater ctor
{}
Cheater& getCheaterPtr() const {return *cheaterPtr;}
int value;
private:
Cheater * cheaterPtr;
};
int main()
{
const Cheater cheater(7); //Initialize the value to 7
// cheater.value = 4; //good, illegal
cheater.getCheaterPtr().value = 4; //oops, legal
return 0;
}
我的困惑是:
const Cheater cheater(7)
在其构造函数中创建一个 const 对象作弊器
Cheater(int avalue) :
value(avalue),
cheaterPtr(this) //conceptually odd legality in const Cheater ctor
{}
'this' 指针用于初始化cheaterPtr
.
我觉得应该不对。cheater
是一个const对象,它的this指针应该是这样的:const Cheater* const this;
这意味着它自己的指针和指针指向的对象都应该是const,我们既不能改变指针的值,也不能修改指针指向的对象。
但 objectcheater
的cheaterPtr
成员类似于Cheater* const cheaterPtr
. 这意味着指针是 const 但它指向的对象可以是非常量。
我们知道,指针到常量到指针到非常量的转换是不允许的:
int i = 0;
const int* ptrToConst = &i;
int * const constPtr = ptrToConst; // illegal. invalid conversion from 'const int*' to 'int*'
如何在初始化列表中允许从指针到常量到指针到非常量的转换?到底发生了什么?
这是我试图提供给原始帖子的构造函数中关于“常量”的描述:
“与其他成员函数不同,构造函数可能不会被声明为 const。当我们创建一个类类型的 const 对象时,该对象在构造函数完成对象的初始化之前不会假定它的‘常量’。因此,构造函数可以写入 const建造过程中的物体。”
--C++ Primer (5th Edition) P262 7.1.4 构造函数