在初始化变量之前调用父类的构造函数?在初始化变量之前调用父类的构造函数?(Are parent cl

2019-05-12 04:50发布

在初始化变量之前调用父类的构造函数,或将编译器首先初始化类的变量?

例如:

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() {};
}

Answer 1:

是的,基类派生的类的成员之前和构造体执行前进行初始化。

12.6.2初始化碱和成员[class.base.init]

在一个非委托构造函数,以下列顺序进行初始化:

- 首先,只对最派生类(1.8)的构造,虚基类在它们出现在基类的有向无环图,其中“左的深度优先左到右的遍历顺序初始化-to-右”是在派生类基础说明符列表的基类的出现的顺序。

- 然后,直接基类中声明的顺序,因为它们出现在基本符列表(不管MEM-初始化的顺序的)进行初始化。

- 那么,非静态数据成员在他们的类定义中声明(再次不管MEM-初始化的顺序)的顺序进行初始化。

- 最后,在执行构造函数体的复合语句。



Answer 2:

是的,父类的构造派生类之前总是被调用。 否则,派生类不能“改变”的东西由父类设置。



Answer 3:

正如一些建议,你可以通常只是测试这样的事情了自己,如果你不知道:

#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


Answer 4:

是的,物体的建设从父类开始,涉及到子类,所以构造函数调用是按照这个顺序。 在破坏的情况下,这是完全相反的。



Answer 5:

认为派生类的额外增加或基类的推广,此外,因此它增加了一些(这东西必须已经存在)。 那么,另一个问题是成员的初始化。 在这里,你提供的默认构造函数

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将随机值,如果有初始化它没有默认构造函数。



文章来源: Are parent class constructors called before initializing variables?