2012-07-30 94 views
29
// 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; 
} 

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

+1

不,除非你想指定一个初始容量(或初始化它的内容,你可以用C++ 11中的初始值设定项列表或boost的list_of' I _think_)。 – hmjd 2012-07-30 16:18:04

+2

这两种方式的向量都是使用默认构造函数构造的,但1st是首选的 – 2012-07-30 16:18:13

+1

@ Mr.Anubis:不是我。 – 2012-07-30 16:18:29

回答

21

http://en.cppreference.com/w/cpp/language/default_initialization

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

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

缺省初始化的效果是:

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

由于std::vector是一个类类型的默认构造函数被调用。所以不需要手动初始化。

+0

让我感到惊讶的是'class T2 {int} mem; public: T2(){} //“mem”not in initializer list };''const T2 t2; // ok,调用用户提供的默认ctor // t2.mem是默认初始化的' – q0987 2012-07-30 16:40:12

+0

我刚刚在VS2010中测试了上面的代码,它是错误的。 t2.mem不是默认初始化的! – q0987 2012-07-30 16:52:51

+1

@ q0987:'mem'是一个'int',它既不是一个类也不是一个数组类型,所以它不会得到默认的初始化。在cppreference上提供的代码几乎总是在C++ 11标准下验证,但我不知道这是否会改变给定情况下的任何内容(给定'const'限定符)。然而,即使这个例子是\t不一致甚至可能是错误的,但解释和标准本身并不是。 – Zeta 2012-07-30 16:54:59

1

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

17

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

ClassName() : m_vecInts(N, 42) {}