59
// 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;
}

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

4

4 回答 4

39

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

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

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

默认初始化的效果是:

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

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

于 2012-07-30T16:19:46.747 回答
26

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

ClassName() : m_vecInts(N, 42) {}
于 2012-07-30T16:18:27.190 回答
9

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

class ClassName
{
public:
    ClassName() {}

private:
    std::vector<int> m_vecInts {1, 2, 3}; // or = {1, 2, 3}
}
于 2019-09-16T17:37:23.307 回答
4

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

于 2012-07-30T16:18:22.293 回答