考虑一下这个
class Foo
{
public:
Foo(){}
~Foo(){}
void NonConstBar() {}
void ConstBar() const {}
};
int main()
{
const Foo* pFoo = new Foo();
pFoo->ConstBar(); //No error
pFoo->NonConstBar(); //Compile error about non const function being invoked
delete pFoo; //No error
return 0;
}
在main函数中,我同时调用了Foo和Foo的非常数函数
尝试调用任何非常量函数都会在Visual Studio中产生错误,如下所示
error C2662: 'Foo::NonConstBar' : cannot convert 'this' pointer from 'const Foo' to 'Foo &'
但是delete pFoo
不会发出任何这样的错误。delete语句被绑定为调用没有常量修饰符的Foo类的析构函数。析构函数还可以调用其他非常数成员函数。那么它是不是一个常量函数呢?或者在一个常量指针上删除是一个特殊的异常?
发布于 2011-12-04 09:07:08
你可以通过常量指针删除对象。在C++11中,您还可以通过常量迭代器擦除容器元素。所以,是的,在某种意义上,析构函数总是“常量”的。
一旦调用析构函数,对象就不复存在了。我认为一个不存在的对象是否是可变的这个问题是没有意义的。
发布于 2011-12-04 09:09:03
只要析构函数被调用,而不是析构函数返回时,对象的生命周期就会结束(对于拥有者/封闭作用域)。
因此,我不认为删除常量有任何问题。当你调用delete时,它已经消失了。
否则,删除常量对象将需要const_cast。
https://stackoverflow.com/questions/8372456
复制相似问题