5

像这样的东西如何在 Cpp 中初始化,当在 my 中时main,我这样做:Testing test

class Testing
{
public:
    Testing();
    void initalize();
    ~Testing();

    void run();

private:
    int x;
    int y;
    int z;

    bool isBugged;

    OtherClass otherClass_;
};

顺序是什么?

4

3 回答 3

2

首先调用类构造函数,初始化列表可用于参数化成员构造函数调用,否则在类构造函数入口处使用它们的默认构造函数。

Class() : otherClass_("fred", 42) {
//ctor body
}

将在的 ctor 主体之前调用OtherClass的 ( OtherClass(char *name, int age),比如说) 构造函数。Class否则将使用默认构造函数(无参数)。但是由于成员在主体中可用,因此它们是在进入主体之前构建的。上面的示例是一个初始值设定项列表,并且是 的Class构造函数显式调用成员构造函数的机会,否则这些构造函数将在此时解析为默认构造函数调用。

成员构造的顺序是它们在类声明中出现(声明的)的顺序。如果这与您在初始化程序列表中调用构造函数的顺序不同,您的编译器应该警告您。

于 2012-06-18T01:03:14.413 回答
1

您没有显示构造函数的代码,但假设它微不足道,那么在其中构造的唯一内容Testing()就是OtherClass.

其他成员变量如果test自动存储则不会初始化,如果是静态存储则静态初始化。这意味着如果是自动存储,它们的成员等。将有一个不确定的值,就像它们被声明为函数变量一样。testx

于 2012-06-18T01:02:22.767 回答
1

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

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

Finally, the constructor body is executed. If that returns normally, then the object is fully constructed.

于 2012-06-18T01:08:51.787 回答