让我们说,我们使用std::vector<int>
或std::vector<long>
.随着向量的大小增加,默认情况下新分配的元素是否会被初始化为0,或者程序员是否需要显式地将它们归零?
Lig*_*ica 10
新元素是价值初始化的:
[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
是一个(可能是cv限定的)类类型(第9节)和一个用户提供的构造函数(12.1),然后T
调用默认构造函数(如果T
没有可访问的默认构造函数,则初始化是错误的);- 如果
T
是没有用户提供的构造函数的(可能是cv限定的)非联合类类型,则该对象是零初始化的,如果T
隐式声明的默认构造函数是非平凡的,则调用该构造函数.- 如果
T
是数组类型,则每个元素都是值初始化的;- 否则,该对象被零初始化.
值初始化的对象被视为构造,因此受本国际标准的规定适用于"构造"对象,"构造函数已完成的对象"等,即使没有为该对象调用构造函数也是如此.初始化.
但请注意,这并不是在向量的末尾讨论"保留"空间.此空间不包含任何有效元素,零初始化或其他.这个答案和标准措辞只讨论了在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
.
归档时间: |
|
查看次数: |
786 次 |
最近记录: |