其他分享
首页 > 其他分享> > 对合成的默认构造函数的理解更正

对合成的默认构造函数的理解更正

作者:互联网

  书上对合成的默认构造函数的初始化方式有误。
  当一个类对象被默认初始化或值初始化时都会执行默认构造函数。

  错误:
  但书上说,合成的默认构造函数对数据成员初始化方式是这样子的:首先考虑类内初始值,如果没有类内初始值,则对该数据成员进行默认初始化。
  然后其他所有的构造函数对数据成员的初始化方式如下:首先考虑构造函数初始值列表,对于构造函数初始值列表中没有被覆盖到的数据成员,按照与合成的默认构造函数相同的方式去初始化。
  更正:
  合成的默认构造函数对数据成员的初始化方式如下:首先考虑类内初始值,如果没有类内初始值,则对该数据成员进行默认初始化或值初始化(至于是默认初始化还是值初始化取决于该类对象被默认初始化还是值初始化)。

  

 1 struct testA{
 2     int i;
 3     double d = 3.14;
 4     int *p;
 5 };
 6 struct testB{
 7     testB():i(1),d(3.14),p(nullptr){}
 8     int i;
 9     double d;
10     int *p;
11     testA a;
12 
13 };
14 int main()
15 {
16     vector<testB> vec(1);
17     cout << vec[0].i << " " << vec[0].d << " " << vec[0].p << endl;
18     cout << vec[0].a.i << " " << vec[0].a.d << " " << vec[0].a.p << endl;
19 return 0;
20 }
ubuntu@VM-12-7-ubuntu:~/cpp_learning/Chapter_9$ ./a.out 
1 3.14 0
0 3.14 0

  当一个vector容器只通过一个容器大小参数进行初始化时,元素都被值初始化。
  如果按照以前书上所讲的方式,则在输出vec[0].a的数据成员时,除了带有类内初始值的d成员外,i和p应该被默认初始化,应该保存的是垃圾值。然而i和p却被值初始化了,这就说明了,vec[0]的类类型testA的成员a是被值初始化的,且a作为类对象,也遵循类对象被值初始化的方式。

标签:初始化,int,初始值,默认,类内,更正,构造函数
来源: https://www.cnblogs.com/L-Joker/p/16480672.html