【问题标题】:C++11 brace/aggregate initialization. When to use it?C++11 大括号/聚合初始化。什么时候使用它?
【发布时间】:2018-02-26 04:47:50
【问题描述】:

在阅读了 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++ c++11 stl initialization


【解决方案1】:

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

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

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

回复。标准库中的类...您当然可以使用类内成员初始化来初始化容器类型。下面的课完全没问题。

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

【讨论】:

  • 感谢您的回复。还有一件事:如果我只想要一个空的std::vectorstd::string(该类稍后将使用),我是否应该在类定义中也将它们初始化为{}?即std::vector&lt;float&gt; data{};std::string message{};?对于指针,{}{nullptr} 不一样吗?
  • @K.K.Slider,两个问题都是肯定的。
猜你喜欢
  • 2013-09-25
  • 2010-12-04
  • 2021-11-22
  • 1970-01-01
  • 2021-12-19
相关资源
最近更新 更多