基类型的std :: vector的默认值

时间:2014-01-20 10:57:42

标签: c++ vector

我正在尝试找出如何使用固定大小的std::vector<Object *>进行初始化,因为我之后不再需要更改它。所以我正在使用这段代码(之前的向量是空的):

mControllerItem.resize(nLines,  nullptr);

根据documentation,第二个元素可用于指定将被复制到新元素中的默认值,但这是可选的。如果没有给出第二个参数,则使用默认构造函数。

如果有像pointer,int等基类型,这里用的是什么?在链接中它没有说任何关于它的内容。它们会被初始化为0,它们是否保持未定义,或者是否有其他机制来确定它们将获得什么值?在链接上的示例中,输出为0,所以我假设它与之相关,但是这是保证的,还是这个实现(或un)定义了?

3 个答案:

答案 0 :(得分:7)

标准规定resize值初始化任何需要插入的项目,因此此处的行为定义得非常好。

简单来说,值初始化意味着:

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

是的,如果是指针,它们将被初始化为空值。所有基类型都有默认构造函数。唯一的区别在于

  1. int a; //将不会调用默认构造函数,因此值为 undefined
  2. class C {int a; C(): a()}; //将调用默认构造函数,值为0
  3. void f(int a = int()) //将调用默认构造函数,值为0