C++:首先调用/初始化哪个?其成员变量的类构造函数或构造函数?
Posted
技术标签:
【中文标题】C++:首先调用/初始化哪个?其成员变量的类构造函数或构造函数?【英文标题】:C++: Which gets called/initialized first? The Class constructor or constructor(s) of its member variable(s)? 【发布时间】:2012-06-18 01:00:10 【问题描述】:当在我的main
中时,如何在 Cpp 中初始化这样的东西:Testing test
?
class Testing
public:
Testing();
void initalize();
~Testing();
void run();
private:
int x;
int y;
int z;
bool isBugged;
OtherClass otherClass_;
;
顺序是什么?
【问题讨论】:
如果您向我们展示构造函数会非常有帮助 【参考方案1】:首先调用类构造函数,初始化列表可用于参数化成员构造函数调用,否则在类构造函数入口处使用它们的默认构造函数。
Class() : otherClass_("fred", 42)
//ctor body
会在Class
的ctor 主体之前调用OtherClass
的(比如OtherClass(char *name, int age)
)构造函数。否则将使用默认构造函数(无参数)。但是由于成员在主体中可用,因此它们是在进入主体之前构建的。上面的示例是一个初始化列表,并且是Class
的构造函数显式调用成员构造函数的机会,否则这些构造函数将在此时解析为默认构造函数调用。
成员构造的顺序是它们(声明)在类声明中出现的顺序。如果这与您在初始化列表中调用构造函数的顺序不同,您的编译器应该警告您。
【讨论】:
【参考方案2】:您没有显示构造函数的代码,但假设它是微不足道的,那么在 Testing()
中构造的唯一内容就是 OtherClass
。
如果test
是自动存储,则其他成员变量不会被初始化,如果是静态存储,其他成员变量将被静态初始化 >。这意味着如果test
是自动存储,则它们的成员x
et.al。将有一个不确定的值,就像它们被声明为函数变量一样。
【讨论】:
【参考方案3】:首先,基类子对象按照声明的顺序进行初始化(尽管您的类没有这些子对象)。
然后按照声明的顺序初始化成员。如果它们出现在构造函数的初始化列表中,那么它们会按照那里的指定进行初始化;否则它们是默认初始化的。对于您的 int
和 bool
成员以及一般的 POD 类型,这意味着它们未初始化(如果对象具有静态存储持续时间,则为零初始化),除非它们在初始化列表中。
最后,构造函数体被执行。如果正常返回,则对象已完全构造。
【讨论】:
假设在Testing
的构造函数中,没有初始化列表。所以,在这种情况下,首先,所有三个int
s 将被初始化,然后bool
,然后OtherClass
的构造函数,然后Testing
的构造函数将被初始化,对吧?提前致谢!以上是关于C++:首先调用/初始化哪个?其成员变量的类构造函数或构造函数?的主要内容,如果未能解决你的问题,请参考以下文章
C++中,类内的成员变量自动初始化为零吗,而全局变量随意赋值