首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >隐式定义类的析构函数

隐式定义类的析构函数
EN

Stack Overflow用户
提问于 2011-12-19 14:57:19
回答 2查看 4.7K关注 0票数 2

考虑类的情况,它没有开发人员显式声明的destructorconstructor。我知道在这种情况下,类的destructor将是implicitly declared。那么,只有当类的一个对象将要被销毁时,destructor才是implicitly defined吗?

构造函数的行为也与上面的行为相同。仅当创建类的对象时,它才是implicitly defined吗?

编辑

代码语言:javascript
复制
class A {
  public:

};
int main() {

}

在上面的代码中,~A()将被隐式声明。我的问题是,只有在类的对象实例化如下的情况下,析构函数的定义才会被隐式地定义。

代码语言:javascript
复制
class A {
      public:

    };
    int main() {
      A a;
    }

或者它是隐式定义的,即使没有完成对象实例化?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-19 15:07:20

是的,隐式声明的默认构造函数和析构函数在用于创建或销毁对象实例时被隐式定义。用标准(C++11)的话说:

12.1/6:默认的、未定义为已删除的默认构造函数在odr使用(3.2)创建类类型对象(1.8)或在其第一次声明后显式默认值时被隐式定义。

12.4/5:默认的、未定义为已删除的析构函数在odr-使用(3.2)销毁其类类型的对象(3.7)或在其第一次声明后显式默认时-被隐式定义。

因此,它们是在第二个代码片段中定义的,它创建并销毁了一个类型为A的对象,但在第一个代码段中却没有。

票数 5
EN

Stack Overflow用户

发布于 2011-12-19 15:01:33

一方面,通常不可能决定一个对象是否在任何非平凡的程序中被创建/破坏*另一方面,只要可观察到的行为保持不变,这并不重要。

然而,在defined when object created/destroyeddefined if needed之间有一条很窄的线。在下面的示例中,需要定义Foo::Foo(),因为有可能需要它。但是,您会问它是否是在创建对象时定义的,而后者是不可判定的。

*

代码语言:javascript
复制
class Foo {};
int main(int argc, char *argv[]) {
    if (argc>1) Foo(); // <- impossible to decide if ever constructed/destroyed
}

// On the other hand, compiler might be smart enough to observe that
// Foo does not have any visible behaviour, remove Foo entirely, and in
// effect spit out this:
int main() {}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8563116

复制
相关文章

相似问题

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