让我们说,我们使用std::vector<int>
or std::vector<long>
。随着向量大小的增长,新分配的元素会默认初始化为 0,还是程序员需要显式地将它们初始化为 0?
3 回答
新元素是值初始化的:
[C++11: 23.3.6.3/9]:
void resize(size_type sz);
效果:如果sz <= size()
,等价于erase(begin() + sz, end());
。如果, 将值初始化size() < sz
的元素附加到序列中。sz - size()
对于两者int
,long
这意味着0
:
[C++11: 8.5/7]:
对类型的对象进行值初始化T
意味着:
- if
T
是具有用户提供的构造函数 (12.1) 的(可能是 cv 限定的)类类型(第 9 条),则调用 for 的默认构造函数(如果没有可访问的默认构造函数T
,则初始化格式错误);T
- if
T
是没有用户提供的构造函数的(可能是 cv 限定的)非联合类类型,则该对象被零初始化,并且如果T
' 的隐式声明的默认构造函数是非平凡的,则调用该构造函数。- 如果
T
是数组类型,则每个元素都是值初始化的;- 否则,对象被零初始化。
一个被值初始化的对象被认为是被构造的,因此受制于适用于“构造的”对象、“构造函数已完成的对象”等的本国际标准的规定,即使没有为对象的构造函数调用构造函数。初始化。
但是请注意,这不是在谈论向量末尾的“保留”空间。此空间不包含任何有效元素,无论是零初始化还是其他。此答案和标准措辞仅讨论执行 a 时获得的元素,resize
而没有为新元素指定显式值。
根据 C++11 标准的第 23.3.6.3/9 段(约std::vector::resize()
):
void resize(size_type sz);
效果:如果 sz <= size(),等价于 erase(begin() + sz, end());。如果 size() < sz,则将 sz - size()值初始化的元素附加到序列中。
此外,根据标准第 8.5/7 段:
对T 类型的对象进行值初始化意味着:
— 如果 T 是具有用户提供的构造函数(12.1)的(可能是 cv 限定的)类类型(第 9 条),则调用 T 的默认构造函数(如果 T 没有可访问的默认构造函数,则初始化是非良构的);
— 如果 T 是没有用户提供的构造函数的(可能是 cv 限定的)非联合类类型,则该对象是零初始化的,如果 T 的隐式声明的默认构造函数是非平凡的,则调用该构造函数。
— 如果 T 是一个数组类型,那么每个元素都是值初始化的;
— 否则,对象是零初始化的。
这意味着在int
新创建的元素的情况下,值初始化为0
.
是的,当std::vector
改变大小时(也许通过做std::vector::resize
),任何新元素都将被初始化。对于诸如int
or之类的类型long
,值初始化会导致零初始化,顾名思义,零初始化会将值设置为 0。