考虑类的情况,它没有开发人员显式声明的destructor和constructor。我知道在这种情况下,类的destructor将是implicitly declared。那么,只有当类的一个对象将要被销毁时,destructor才是implicitly defined吗?
构造函数的行为也与上面的行为相同。仅当创建类的对象时,它才是implicitly defined吗?
编辑
class A {
public:
};
int main() {
}在上面的代码中,~A()将被隐式声明。我的问题是,只有在类的对象实例化如下的情况下,析构函数的定义才会被隐式地定义。
class A {
public:
};
int main() {
A a;
}或者它是隐式定义的,即使没有完成对象实例化?
发布于 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的对象,但在第一个代码段中却没有。
发布于 2011-12-19 15:01:33
一方面,通常不可能决定一个对象是否在任何非平凡的程序中被创建/破坏*另一方面,只要可观察到的行为保持不变,这并不重要。
然而,在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() {}https://stackoverflow.com/questions/8563116
复制相似问题