书上对合成的默认构造函数的初始化方式有误。
当一个类对象被默认初始化或值初始化时都会执行默认构造函数。
错误:
但书上说,合成的默认构造函数对数据成员初始化方式是这样子的:首先考虑类内初始值,如果没有类内初始值,则对该数据成员进行默认初始化。
然后其他所有的构造函数对数据成员的初始化方式如下:首先考虑构造函数初始值列表,对于构造函数初始值列表中没有被覆盖到的数据成员,按照与合成的默认构造函数相同的方式去初始化。
更正:
合成的默认构造函数对数据成员的初始化方式如下:首先考虑类内初始值,如果没有类内初始值,则对该数据成员进行默认初始化或值初始化(至于是默认初始化还是值初始化取决于该类对象被默认初始化还是值初始化)。
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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。