考虑以下课程
class A
{
int a;
double b;
float c;
A():a(1),c(2),b(3)
{}
}
我们是否必须按照我们在类中声明的顺序使用初始化列表中的变量?初始化列表中的变量顺序是否会对该类/变量的内存分配产生影响? (考虑一下场景,如果类有很多bool变量,很多双变量等等。)
答案 0 :(得分:5)
我们是否必须按照我们在类中声明的顺序使用初始化列表中的变量?
初始化列表顺序对初始化顺序没有影响。因此,它避免了在初始化列表中使用实际顺序的误导行为。
存在依赖关系时出现问题:
class A
{
int a;
double b;
float c;
// initialization is done in that order: a, b, c
A():a(1), c(2), b(c + 1) // UB, b is in fact initialized before c
{}
};
初始化列表中的变量顺序是否会对该类/变量的内存分配产生影响?
初始化顺序列表不会对布局或初始化顺序产生影响。
答案 1 :(得分:4)
首先,
我们是否必须按照我们在类中声明的顺序使用初始化列表中的变量?
不,但你最好这样做以避免混淆。因为列表中member initializers的顺序无关紧要。
列表中成员初始值设定项的顺序是无关紧要的:实际的 初始化顺序如下:
1)如果构造函数用于 最派生的类,虚拟基类在中初始化 它们出现在深度优先从左到右遍历的顺序 基类声明(从左到右指的是外观) base-specifier lists)
2)然后,在中初始化直接基类 它们出现在这个类的基本说明符列表中的从左到右的顺序
3)然后,按照以下顺序初始化非静态数据成员 类定义中的声明。
4)最后,身体的 构造函数被执行
第二,
初始化列表中的变量顺序是否会对该类/变量的内存分配产生影响?
不,因为它根本不重要。
答案 2 :(得分:2)
变量将按照类中的声明顺序进行初始化。
初始化列表中的变量顺序不会影响。
在我们的示例中,初始化变量的顺序如下:a, b, c
初始化列表中的变量顺序是否会产生任何影响 关于那个类/变量的内存分配?
不起作用。