如果有默认成员初始化,为什么要使用成员初始化列表
Why use member init lists if there is default member initialization
在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自成立以来就具有等效的概念,程序员已经详细讨论了两种不同初始化机制的优点,例如,请参阅默认构造函数与内联字段初始化。
- C++成员初始化
- c++构造函数成员初始化:传递参数
- C++正确的指针成员初始化
- 将另一个类的对象传递到当前类C++的构造函数中(不是成员初始化)
- WinLamb 错误:成员初始化非法
- 使用其他成员初始化结构的成员?
- C++模板类静态成员初始化
- 解释了构造函数成员初始化列表
- 如何在成员初始化列表中声明共享指针
- C++入门5版:使用get成员初始化另一个与shared_ptr无关的对象
- C++11 默认类成员初始化与初始值设定项列表同时
- 调用非默认构造函数作为成员初始化
- C++模板成员初始化:用右值移动构造,但用左值移动引用
- 类成员初始化C++
- 在成员初始化列表中,我可以创建对列表中不在列表中的成员变量的引用
- C :(不重复)积分静态成员初始化(不仅是声明!),导致链接器错误,原因
- 如何调用成员初始化器列表中参考成员的构造函数
- C 构造函数采用成员初始化器
- 与其他静态const成员初始化静态常量成员
- 静态内联成员初始化顺序