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

时间:2011-12-04 01:02:57

标签: 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;
}

在主要功能中,我将常量非常功能称为 Foo

尝试调用任何非const函数会在Visual Studio中产生错误,如此

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

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

2 个答案:

答案 0 :(得分:20)

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

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

答案 1 :(得分:5)

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

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

否则删除常量对象需要const_cast。