2014-01-20 125 views
1

我在试图找出如何以固定大小初始化std::vector<Object *>,因为之后我不需要再改变它。所以我使用这个代码(所述载体是空前):基本类型std :: vector的默认值

mControllerItem.resize(nLines, nullptr); 

按照documentation第二元件可以被用来指定一个默认将被复制到新的元件,但是这是可选的。如果没有给出第二个参数,那么使用默认的构造函数。

在指针,int等基本类型的情况下,这里使用了什么?在链接中它没有提到任何关于它的内容。他们会被初始化为0,他们保持未定义,还是有一些其他机制,确定他们将得到什么值?在链接的例子中,输出为0,所以我认为它与此无关,但是这是否是保证,还是这个实现(或未定义)?

+0

'std :: vector v(nLines,nullptr);' – Borgleader

+0

@Borgleader Thx!我改变了这一点。这有什么不同吗? – Devolus

+0

他们将零初始化 – user3125280

回答

6

该标准规定resize值初始化任何需要插入的项目,所以这里的行为是完全明确的。

简单来说,值初始化装置:

  • 类类型,默认构造函数被调用;如果没有提供构造函数,则对于任何类型T的标量,每个成员都进行了值初始化(递归)
  • ,它们的值为(T)0(这保证了如果T是指针,则使用的值将是空的,
+0

@MikeSeymour:谢谢,编辑。 – Jon

3

C++ 03和C++ 11之间的行为定义略有不同。在前者中,创建了一个初始化值对象,并且向量中的新元素是从中复制构建的。在新版本中,新元素直接进行了值初始化。

对于像指针这样的内置类型,值初始化等于零初始化,所以事实上,对于这两个标准版本,您的元素都保证为零。

请注意,假设使用默认构造函数实际上并不完全正确。它是,但只适用于自定义类型。只是发生值初始化的语法调用自定义类型的默认构造函数,并为内置类型进行零初始化。

1

是的,如果是指针,它们会被初始化为空值。所有基类型都有默认的构造函数。唯一不同的是

  1. int a; //默认的构造函数将不会被调用,所以价值是不确定的
  2. class C {int a; C(): a()}; //默认的构造函数将被调用,值为0
  3. void f(int a = int()) //默认的构造函数将被调用,值为0