struct B {
int b1, b2;
B(int, int);
};
struct D : B {
int d1, d2;
// which is technically better ?
D (int i, int j, int k, int l) : B(i,j), d1(k), d2(l) {} // 1st Base
// or
D (int i, int j, int k, int l) : d1(k), d2(l), B(i,j) {} // last Base
};
以上只是伪代码。实际上,我想知道调用基础构造函数的顺序重要吗?
是否有任何情况导致的不良行为(尤其是极端情况)?我的问题是关于更多技术方面的问题,不是编码风格。
最佳答案
您在问题中提到的顺序不是“调用基本构造函数的顺序”。实际上,您不能调用构造函数。用户不能调用构造函数。只有编译器才能调用构造函数。
您可以做的是指定初始值设定项。在这种情况下(构造函数初始值设定项列表),您正在为某个较大对象的子对象指定初始值设定项。您指定这些初始化程序的顺序无关紧要:编译器将按照语言规范定义的非常特定的顺序调用构造函数,而不管您指定初始化程序的顺序如何。总是首先调用基类构造函数(按照基类在类定义中列出的顺序),然后调用成员子对象的构造函数(同样,按照这些成员在类定义中列出的顺序)。
(当涉及到虚拟基类时,这条规则有一些特殊之处,但我决定不在这里包括它们。)
至于不良行为……当然这里也有可能出现“不良行为”。如果您假设初始化顺序取决于您在构造函数初始化列表中使用的顺序,当您发现编译器完全忽略该顺序并使用它自己的顺序(顺序声明)代替。比如这段代码的作者
struct S {
int b, a;
S() : a(5), b(a) {}
};
可能期望 a
首先被初始化,而 b
从 a
接收初始值 5
, 但实际上这不会发生,因为 b
在 a
之前初始化。
关于c++ - 从派生类初始化列表调用基类构造函数的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6247595/