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】:

首先,基类子对象按照声明的顺序进行初始化(尽管您的类没有这些子对象)。

然后按照声明的顺序初始化成员。如果它们出现在构造函数的初始化列表中,那么它们会按照那里的指定进行初始化;否则它们是默认初始化的。对于您的 intbool 成员以及一般的 POD 类型,这意味着它们未初始化(如果对象具有静态存储持续时间,则为零初始化),除非它们在初始化列表中。

最后,构造函数体被执行。如果正常返回,则对象已完全构造。

【讨论】:

假设在Testing的构造函数中,没有初始化列表。所以,在这种情况下,首先,所有三个ints 将被初始化,然后bool,然后OtherClass 的构造函数,然后Testing 的构造函数将被初始化,对吧?提前致谢!

以上是关于C++:首先调用/初始化哪个?其成员变量的类构造函数或构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

成员对象和封闭类

如何在构造函数中初始化 C++ 对象成员变量?

C++中,类内的成员变量自动初始化为零吗,而全局变量随意赋值

在 C++ 中定义对象而不调用其构造函数

C++ 通过分配其他构造函数初始化的类成员来初始化类成员是一个坏主意吗?

C++中的派生类,可以不定义对象直接调用基类的成员和调用自己的成员函数嘛???