在 C++11 中,引入了默认成员初始化。所以,我只是想问一下,为什么仍然必须使用成员初始值设定项列表来支持这些?
例如
如果这是允许的
class apple
{
int i = 10;
};
为什么要使用这个
class apple
{
int i;
apple(): i(10) {}
};
有什么特别的优势吗?
在 C++11 中,引入了默认成员初始化。所以,我只是想问一下,为什么仍然必须使用成员初始值设定项列表来支持这些?
例如
如果这是允许的
class apple
{
int i = 10;
};
为什么要使用这个
class apple
{
int i;
apple(): i(10) {}
};
有什么特别的优势吗?
这里没有“必须”,可能会根据情况做出决定。
例如,如果初始化值不是常量,或者多个构造函数中的每个值必须不同,则使用初始化列表是有意义的。
如果您必须支持 C++11 之前的版本(这在大型项目中可能比您想象的更常见),您必须始终使用初始化列表。相应地,如果您的大多数代码维护人员不熟悉 C++11 特性,那么使用长期存在的机制可能比内联初始化更好。
如果使用 C++11 不是问题,并且您正在跨多个构造函数初始化单个常量值,那么初始化形式可能更有意义。
成员初始化器列表可以使用特定于构造函数的初始化器来初始化成员。
例如,初始化器可能依赖于构造函数的参数,例如
class apple
{
int i;
apple(int i_) : i(i_) {}
};
或在不同的构造函数之间改变,例如
class apple
{
int i;
apple(foo_type) : i(0) {}
apple(bar_type) : i(1) {}
};
这两种情况都不能由单个默认成员初始化程序处理。
如果您不想,则不必使用成员初始化器列表。此外,您可以混合使用默认成员初始化和成员初始化器列表。这不仅仅是一个或另一个。默认成员初始化器将用于未出现在成员初始化器列表中的任何成员。
你选择哪一个取决于很多事情。
当成员应始终使用相同的值初始化时,默认成员初始化很有用。这是一种方便的简写,可以增加清晰度,因为初始值显示在声明的位置。
另一方面,如果您需要使用在运行时确定的不同值来初始化成员,则无法使用默认初始化程序来执行此操作;您必须在构造函数中执行此操作。
与 C++ 不同,默认成员初始化是一个相对较新的概念,Java 从一开始就有类似的概念,程序员已经详细讨论了两种不同初始化机制的优点,例如,请参阅默认构造函数与内联字段初始化。