Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:哪个先被调用/初始化?类构造函数或其成员变量的构造函数?_C++_Oop_Class_Initialization - Fatal编程技术网

C++ C++;:哪个先被调用/初始化?类构造函数或其成员变量的构造函数?

C++ C++;:哪个先被调用/初始化?类构造函数或其成员变量的构造函数?,c++,oop,class,initialization,C++,Oop,Class,Initialization,当在我的main中,我做:测试时,像这样的东西是如何在Cpp中初始化的 class Testing { public: Testing(); void initalize(); ~Testing(); void run(); private: int x; int y; int z; bool isBugged; OtherClass otherClass_; }; 顺序是什么?您不显示构造函数的代码,但假设它很简

当在我的
main
中,我做:
测试时,像这样的东西是如何在Cpp中初始化的

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

    void run();

private:
    int x;
    int y;
    int z;

    bool isBugged;

    OtherClass otherClass_;
};

顺序是什么?

您不显示构造函数的代码,但假设它很简单,那么在
Testing()
中构造的唯一内容就是
其他类


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

首先调用类构造函数,可以使用初始值设定项列表来参数化成员构造函数调用,否则在类构造函数入口使用它们的默认构造函数

Class() : otherClass_("fred", 42) {
//ctor body
}
将在
类的构造函数主体之前调用
其他类的构造函数(
其他类(char*name,int age)
)。否则将使用默认构造函数(无参数)。但是,由于构件在主体中可用,因此它们在主体进入之前构造。上面的示例是一个初始值设定项列表,是
Class
的构造函数显式调用成员构造函数的机会,否则会在此时解析为默认构造函数调用


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

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

然后,按照声明的顺序,对成员进行草签。如果它们出现在构造器的初始化器列表中,则按照其中的规定进行初始化;否则,它们将默认初始化。对于
int
bool
成员以及POD类型,这意味着它们未初始化(如果对象具有静态存储持续时间,则为零初始化),除非它们在初始化器列表中


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

如果您向我们展示构造函数集,这将非常有用。例如,在
测试的构造函数中,没有初始值设定项列表。因此,在这种情况下,首先,所有三个
int
s将被初始化,然后
bool
,然后
OtherClass
的构造函数,然后
测试的构造函数将被初始化,对吗?提前谢谢!