让我们说,我们使用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),任何新元素都将被初始化。对于诸如intor之类的类型long,值初始化会导致零初始化,顾名思义,零初始化会将值设置为 0。