C++11 大括号/聚合初始化.什么时候使用它?

C++11 brace/aggregate initialization. When to use it?

本文关键字:什么时候 初始化 C++11      更新时间:2023-10-16

在阅读了C++11和围绕它的常见准则之后,我经常阅读有关如何使用类内初始化和聚合初始化的信息。

下面是一个似乎是"旧"做事方式的例子:

class Example
{
public:
// Set "m_x" to "x", "m_y" gets set to the default value of 5
Example(int x) : m_x(x), m_y(5)
{
}
private:
int m_x;
int m_y;
};

据我了解,这就是人们现在推荐的:

class Example
{
public:
Example(int x) : m_x{x}
{
}
private:
int m_x{0}; // Supposedly {} works too? I guess this would
// only be necessary if I had another constructor
// taking in 0 arguments, so "m_x" doesn't go uninitialized
int m_y{5};
};

我的问题是:这对指针、引用和一些 STL 类有何影响?这些的最佳实践是什么?他们只是用{}初始化吗?此外,即使构造函数初始化了变量,我是否应该这样做?(即编写m_x{},即使它被构造函数设置为其他内容)

谢谢。

可以使用类内成员初始化和委派构造函数来减少代码重复。请参阅我对相关问题的回答:使用 C++ 11 进行重构。

指针类型的成员变量可以使用类内成员初始化初始化为nullptr。使用类内成员初始化初始化指向其他内容的指针似乎没有用。您必须根据您的特定用例来判断它。

引用类型的成员变量很可能需要使用初始值设定项列表语法进行初始化。 使用类内成员初始化初始化对其他内容的引用似乎没有用。您必须根据您的特定用例来判断它。

来自标准库的类...当然,您可以使用类内成员初始化来初始化容器类型。下面的类是完全可以的。

struct Foo
{
std::vector<int> ar = {20};
};