正确的初始化矢量成员变量的方法

q09*_*987 38 c++

// Method One
class ClassName
{
public:
    ClassName() : m_vecInts() {}

private:
    std::vector<int> m_vecInts;
}

// Method Two
class ClassName
{
public:
    ClassName() {} // do nothing

private:
    std::vector<int> m_vecInts;
}
Run Code Online (Sandbox Code Playgroud)

问题>初始化类的向量成员变量的正确方法是什么?我们是否必须初始化它?

Zet*_*eta 25

请参见http://en.cppreference.com/w/cpp/language/default_initialization

默认初始化在以下三种情况下执行:

  1. 声明自动存储持续时间的变量时没有初始值设定项
  2. 当具有动态存储持续时间的对象由没有初始化程序的new-expression创建时
  3. 构造函数初始值设定项列表中未提及基类或非静态数据成员且调用该构造函数时.

默认初始化的效果是:

  • 如果T是类类型,则调用默认构造函数以提供新对象的初始值.
  • 如果T是数组类型,则数组的每个元素都是默认初始化的.
  • 否则,什么也没做.

由于std::vector是类类型,因此调用其默认构造函数.因此不需要手动初始化.

  • @q0987:`mem` 是一个 `int`,它既不是一个类,也不是一个数组类型,所以它不会被默认初始化。cppreference 上提供的代码几乎总是在 C++11 标准下验证,但我不知道这是否会改变给定情况的任何内容(考虑到 `const` 限定符)。但是,即使示例不一致甚至可能是错误的,解释和标准本身也不是。 (2认同)

jua*_*nza 20

这取决于.如果你想要一个0号向量,那么你不需要做任何事情.如果你想要一个大小为N的向量填充42s,那么使用构造函数初始化列表:

ClassName() : m_vecInts(N, 42) {}
Run Code Online (Sandbox Code Playgroud)


mrt*_*rts 9

从 C++11 开始,您还可以直接在类声明中使用非静态成员的列表初始化

class ClassName
{
public:
    ClassName() {}

private:
    std::vector<int> m_vecInts {1, 2, 3}; // or = {1, 2, 3}
}
Run Code Online (Sandbox Code Playgroud)

  • 当向量的大小非常大时,例如当我想要一个包含 40 个元素的向量且全部初始化为 100 时,是否有其他语法可以提供帮助? (2认同)
  • @sancho.sReinstateMonicaCellio `std::vector&lt;int&gt; m_vecInts = std::vector&lt;int&gt;(40, 100);` 会起作用。 (2认同)

mat*_*975 5

您不必显式初始化它,它会在您创建类的实例时创建。