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
};
上面只是一个伪代码。事实上,我想知道调用基本构造函数的顺序重要吗?
有没有不良行为(尤其极端情况)是由任何一种情况引起的吗?我的问题是更多技术方面的问题not关于编码风格。
您在问题中引用的顺序不是“调用基本构造函数的顺序”。事实上,你不能调用构造函数。用户不能调用构造函数。只有编译器才能调用构造函数。
你能做的就是指定初始值设定项。在这种情况下(构造函数初始值设定项列表),您正在为某个较大对象的子对象指定初始值设定项。指定这些初始值设定项的顺序并不重要:编译器将按照语言规范定义的非常特定的顺序调用构造函数,而不管您指定初始值设定项的顺序如何。始终首先调用基类构造函数(按照基类在类定义中列出的顺序),然后调用成员子对象的构造函数(同样按照这些成员在类定义中列出的顺序)。
(当涉及到虚拟基类时,这条规则有一些特殊之处,但我决定不将它们包括在这里。)
至于不良行为……当然,这里有可能出现“不良行为”。如果您假设初始化的顺序取决于您在构造函数初始值设定项列表中使用的顺序,那么当您发现编译器完全忽略该顺序并使用它自己的顺序(声明)代替。例如这段代码的作者
struct S {
int b, a;
S() : a(5), b(a) {}
};
可能会期待a
首先要初始化,并且b
接收初始值5
from a
,但实际上这不会发生,因为b
之前已初始化a
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)