2

考虑没有由开发人员明确声明的类的destructor情况constructor。我知道在这种情况下destructor将是一个班级。那么只有当类的一个对象即将被销毁时isimplicitly declared是真的吗?destructorimplicitly defined

构造函数的行为是否也和上面一样。是否implicitly defined仅在创建类的对象时?

编辑

class A {
  public:

};
int main() {

}

在上面的代码中,~A() 将被隐式声明。我的问题是,只有当类的对象实例化为

class A {
      public:

    };
    int main() {
      A a;
    }

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

4

3 回答 3

5

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

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

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

所以它们是在你的第二个代码片段中定义的,它创建和销毁一个类型的对象A,但不是在第一个,它没有。

于 2011-12-19T15:07:20.297 回答
0

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

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


*:

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() {}
于 2011-12-19T15:01:33.130 回答
0

是否定义函数不是在运行时确定的,因此不能“定义析构函数,仅当对象 [..]即将被销毁时”仅仅因为您的可执行文件是静态的,而不是为特定运行创建的。

但是,如果最终可执行文件中不存在对析构函数的调用,则链接器可能会 选择完全删除该函数。


最后一点,考虑这个例子:

class A {
  A() {}
  ~A() {}
};
class B {
  A a; // cannot access dtor nor ctor of A
};

如果您从不实例化B,这将实际编译和链接,因为 noB::B()和 no B::~B()ever 被合成。然而,如果你试图创建一个对象,B编译器会叫你一些花哨的名字,仅仅是因为你强迫它去综合B::B()B::~B()它做不到。

于 2011-12-19T15:01:50.957 回答