首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >析构函数被认为是常量函数吗?

析构函数被认为是常量函数吗?
EN

Stack Overflow用户
提问于 2011-12-04 09:02:57
回答 2查看 4.1K关注 0票数 26

考虑一下这个

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函数中,我同时调用了FooFoo非常数函数

尝试调用任何非常量函数都会在Visual Studio中产生错误,如下所示

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

但是delete pFoo不会发出任何这样的错误。delete语句被绑定为调用没有常量修饰符的Foo类的析构函数。析构函数还可以调用其他非常数成员函数。那么它是不是一个常量函数呢?或者在一个常量指针上删除是一个特殊的异常?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-04 09:07:08

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

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

票数 22
EN

Stack Overflow用户

发布于 2011-12-04 09:09:03

只要析构函数被调用,而不是析构函数返回时,对象的生命周期就会结束(对于拥有者/封闭作用域)。

因此,我不认为删除常量有任何问题。当你调用delete时,它已经消失了。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8372456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档