在初始化变量之前调用父类的构造函数,或将编译器首先初始化类的变量?
例如:
class parent {
int a;
public:
parent() : a(123) {};
};
class child : public parent {
int b;
public:
// question: is parent constructor done before init b?
child() : b(456), parent() {};
}
在初始化变量之前调用父类的构造函数,或将编译器首先初始化类的变量?
例如:
class parent {
int a;
public:
parent() : a(123) {};
};
class child : public parent {
int b;
public:
// question: is parent constructor done before init b?
child() : b(456), parent() {};
}
是的,基类派生的类的成员之前和构造体执行前进行初始化。
在一个非委托构造函数,以下列顺序进行初始化:
- 首先,只对最派生类(1.8)的构造,虚基类在它们出现在基类的有向无环图,其中“左的深度优先左到右的遍历顺序初始化-to-右”是在派生类基础说明符列表的基类的出现的顺序。
- 然后,直接基类中声明的顺序,因为它们出现在基本符列表(不管MEM-初始化的顺序的)进行初始化。
- 那么,非静态数据成员在他们的类定义中声明(再次不管MEM-初始化的顺序)的顺序进行初始化。
- 最后,在执行构造函数体的复合语句。
是的,父类的构造派生类之前总是被调用。 否则,派生类不能“改变”的东西由父类设置。
正如一些建议,你可以通常只是测试这样的事情了自己,如果你不知道:
#include <iostream>
using namespace std;
class parent {
protected:
int a;
public:
parent() : a(123) { cout << "in parent(): a == " << a << endl; };
};
class child : public parent {
int b;
public:
// question: is parent constructor done before init b?
child() : b(456), parent() { cout << "in child(): a == " << a << ", b == " << b << endl; };
};
int main() {
child c;
return 0;
}
版画
in parent(): a == 123
in child(): a == 123, b == 456
是的,物体的建设从父类开始,涉及到子类,所以构造函数调用是按照这个顺序。 在破坏的情况下,这是完全相反的。
认为派生类的额外增加或基类的推广,此外,因此它增加了一些(这东西必须已经存在)。 那么,另一个问题是成员的初始化。 在这里,你提供的默认构造函数
public:
parent() : a(123) {};
所以该成员将被默认用123初始化,即使你创建父这样说:
parent p;
如果没有默认构造函数与值初始化对象
class parent {
public:
int a;
};
比将被默认成员取决于什么,如果类是POD则INT将是默认初始化为0,但如果它不是,也就是你提供更多的成员,如字符串或向量
class parent {
public:
int a;
std::string s;
std::vector<int> v;
};
INT将随机值,如果有初始化它没有默认构造函数。