析构函数被认为是const函数吗?

par*_*mar 22 c++ destructor

考虑一下

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;
}
Run Code Online (Sandbox Code Playgroud)

在main函数中,我调用了Foo的const非const函数

试图调用任何非const函数会在Visual Studio中产生错误,就像这样

error C2662: 'Foo::NonConstBar' : cannot convert 'this' pointer from 'const Foo' to 'Foo &'

delete pFoo不会发出任何此类错误.delete语句必然会调用没有const修饰符的Foo类的析构函数.析构函数也允许调用其他非const成员函数.那么它是一个const函数吗?或者是在const指针上删除一个特殊的异常?

Ker*_* SB 20

您可以通过常量指针删除对象.在C++ 11中,您还可以通过常量迭代器擦除容器元素.所以是的,从某种意义上说,析构函数总是"不变的".

一旦调用析构函数,该对象就不复存在了.我认为一个不存在的对象是否可变的问题是没有实际意义的.

  • @MarkRansom:鉴于你可以通过C++中的const指针来销毁对象,*或者*破坏它不是"修改它的状态",*或*一个const指针不是"意味着阻止你修改它的状态".这不是语言的意外,它是完全故意的,所以虽然你可能不喜欢它,但如果你认为破坏是修改那么声称该语言旨在通过const指针阻止所有修改是错误的. (2认同)

Fai*_*Dev 5

一旦调用析构函数,对象的生命周期就结束(对于所有者/封闭范围),而不是在析构函数返回时.

因此,我没有看到删除常量的任何问题.当你打电话给删除时,它已经消失了.

否则删除常量对象将需要const_cast.