考虑以下(简化的)情况:
class Foo
{
private:
int evenA;
int evenB;
int evenSum;
public:
Foo(int a, int b) : evenA(a-(a%2)), evenB(b-(b%2)), evenSum(evenA+evenB)
{
}
};
当我像这样实例化 Foo 时:
Foo foo(1,3);
那么evenA是0,evenB是2,但是evenSum会被初始化为2吗?
我在当前的平台(iOS)上尝试过这个,它似乎可以工作,但我不确定这个代码是否可移植。
感谢您的帮助!
This is well-defined and portable,1 but it's potentially error-prone.
成员按照它们在类主体中声明的顺序进行初始化,而不是按照它们在初始化列表中列出的顺序进行初始化。因此,如果您更改类主体,此代码可能会默默地失败(尽管许多编译器会发现这一点并发出警告)。
1. From [class.base.init] in the C++ standard(s):
在非委托构造函数中,初始化按以下顺序进行:
- 首先,仅对于最派生类 (1.8) 的构造函数,虚拟基类在以下位置初始化:
它们在基类有向无环图的深度优先从左到右遍历中出现的顺序,
其中“从左到右”是派生类基说明符列表中基类的出现顺序。
- 然后,直接基类按照它们出现在基说明符列表中的声明顺序进行初始化
(无论内存初始化器的顺序如何)。
-
然后,非静态数据成员按照它们在类定义中声明的顺序进行初始化(同样无论内存初始化器的顺序如何)。
- 最后,执行构造函数体的复合语句。
(突出显示是我的。)
标准的这一部分接着给出了使用成员变量来初始化其他成员变量的示例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)