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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (12)

考虑这一点

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的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指针上删除一个特殊的异常?

提问于
用户回答回答于

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

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

用户回答回答于

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

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

否则,删除常量对象将需要一个const_cast。

扫码关注云+社区