C++ - 未初始化的向量<int>的值

ano*_*non 44 c++ scope initialization vector

我从答案明白这个问题 是全局/静态初始化为int值将为0回答这一说,对向量,对象类型的默认构造函数将被调用.

我无法弄清楚 - 当我vector<int> v(10)在本地函数中时会发生什么 .int的默认构造函数是什么?如果我在vector<int> v(10)全球宣布怎么办?

我所看到的是, vector<int> v(10)在本地函数中导致变量为0 - 但我不确定这是因为我的编译器还是固定的预期行为.

Mar*_*k B 43

零初始化在标准中指定为内置类型的默认零初始化/值初始化,主要是为了在模板使用中仅支持这种类型的情况.

请注意,此行为与局部变量不同,例如,int x;该值保留未初始化的值(如在C语言中继承行为).


Cas*_*Cow 40

它不是未定义的行为,矢量会自动初始化其所有元素.如果需要,您可以选择其他默认值.

构造函数是:

vector( size_type, T t = T() )

对于int,默认类型(返回者int())为0.

在本地函数中:

int x;

不保证将变量初始化为0.

int x = int();

会这样做的.

int x();

遗憾的是,两者都没有宣布功能.

  • 注意:要声明默认初始化的“int”,可以使用:“int x {};” (2认同)

Jam*_*lis 10

您正在使用的构造函数实际上有两个参数,第二个参数是可选的.它的声明如下:

explicit vector(size_type n, const T& value = T())
Run Code Online (Sandbox Code Playgroud)

第一个参数是vector最初创建的元素数量; 第二个参数是要复制到每个元素中的值.

对于任何对象类型T,T()称为"值初始化".对于数字类型,它会给你0.对于具有默认构造函数的类类型,它为您提供了一个使用该构造函数进行默认构造的对象.

关于"神奇的括号"的更多细节,我建议阅读Michael Burr对"类型名称后的括号是否与新的有所区别?"这一问题的出色回答. 它在new具体使用时讨论了值初始化,但大多数情况下适用于值初始化,只要它可以使用.

  • 这在 C++11 中不再正确,现在有一个单独的 `vector(size_type n)` 构造函数,你提到的双参数构造函数不再有第二个参数的默认值。但是,语义是相同的:您获得的是值初始化,而不是默认初始化。请参阅 https://en.cppreference.com/w/cpp/named_req/DefaultInsertable (3认同)