如果有默认成员初始化,为什么要使用成员初始化列表

Why use member init lists if there is default member initialization

本文关键字:成员 初始化 列表 默认 如果 为什么      更新时间:2023-10-16

在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自成立以来就具有等效的概念,程序员已经详细讨论了两种不同初始化机制的优点,例如,请参阅默认构造函数与内联字段初始化。