我知道不允许修改常量对象的状态,但是为什么析构函数可以更改此状态?
class A
{
public:
~A()
{
i = 2; //?
}
void test() const
{
//i = 1; //Not allowed
}
int i = 0;
};
int main()
{
const A o;
o.test();
}
Run Code Online (Sandbox Code Playgroud)
eer*_*ika 22
为什么析构函数可以更改此状态?
因为能够在析构函数中更改对象的状态(无论是否为const)可能会很有用。
而且因为封装无关紧要。生命周期已经结束,因此任何人都无法看到处于修改状态的对象。
而且由于标准(引自草案)是这样说的:
[class.dtor]
不得使用析构函数的地址。可以为const,volatile或const volatile对象调用析构函数。const和volatile语义([dcl.type.cv])不会应用于正在破坏的对象。当最派生对象([intro.object])的析构函数启动时,它们停止生效。
一旦执行了析构函数,对象的生命周期就已经结束。禁止修改状态的操作没有任何意义,因为作为行为良好的代码一部分的任何调用者都不会看到这种修改后的状态。同样,生命周期结束后,对象是否已const预先存储也没关系。这与构造函数不是const合格的特殊成员函数的原因相同。他们在对象的生存期之前对其进行设置。一旦它还活着,就可能是const没有意义的,而且没有什么价值。
| 归档时间: |
|
| 查看次数: |
968 次 |
| 最近记录: |