我已阅读,std::vector
总是初始化它与它们的对象default values
说了一个int
很0
.即使classes
在default constructor
调用的地方也应该适用.然而,测试程序显示的结果有点不同: -
#include#include using namespace std; class A { public: int i; A(){}; }; class B { public: int i; B() = default; }; template void seev (const vector &v) { for (auto &x:v) { cout << x.i << ' '; } cout << '\n'; } int main() { vector vi(5); // just to show that std::vector always default initializes values & hence int will be 0 here vector va(5); vector vb(5); for (auto x: vi) cout << x << ' '; cout << '\n'; seev (va); seev (vb); return 0; }
输出是: -
0 0 0 0 0 8854016 0 8847696 0 8854016 0 0 0 0 0
我的问题是为什么成员的价值i
未定义为A
¬ for B
?constructor
签名有何不同之处: -
A() {}
&
B() = default;
做?
默认初始化和值初始化之间存在差异.显示的区别B
不是A
:
当类具有非= default
ed构造函数时,在使用默认值或值初始化时将调用此构造函数.它的职责是适当地初始化所有成员.
当一个类没有构造函数或者一个= default
ed默认构造函数时,成员的初始化取决于对象的构造方式:在没有括号的情况下初始化对象时,默认初始化完成,这使得没有默认构造函数的子对象未初始化.当用括号值初始化对象初始化时,该值初始化所有子对象.内置类型的值初始化意味着它们获得合适的零值,而内置类型的默认初始化意味着它们未被初始化.
由于A
具有显式编写的默认构造函数,因此其构造函数需要使用默认构造函数初始化非类类型的所有成员.B
具有隐式编写的默认构造函数,并且根据子对象的需要执行默认值或值初始化.
a std::vector
中的对象是使用构造的T()
(如果没有提供其他参数,例如,用于push_back()
或emplace_back()
).对于A
那些意味着它们未被初始化的B
成员,对于那些意味着它们被初始化为零的成员.