CPP。首先调用/初始化? Classes构造函数或其成员类构造函数?

时间:2012-06-18 01:00:10

标签: c++ oop class initialization

这样的事情如何在Cpp中初始化,当我在我的主要部分时:测试测试;

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

    void run();

private:
    int x;
    int y;
    int z;

    bool isBugged;

    OtherClass otherClass_;
};

订单是什么?

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

你没有显示构造函数的代码,但假设它是微不足道的,那么在Testing()中构造的唯一东西是OtherClass

如果test属于自动存储,则不会初始化其他成员变量,或者静态存储< 静态存储 / em>的。这意味着如果test属于自动存储,则其成员x等。将具有不确定的值,就像它们被声明为函数变量一样。

答案 2 :(得分:1)

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

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

最后,执行构造函数体。如果它正常返回,那么该对象是完全构造的。