C++-构造函数初始化类成员问题?

项目合作 项目合作 主题:1030 回复:2135

C++-构造函数初始化类成员问题?

灵芸 发布于 2017-09-12 字数 162 浏览 1158 回复 6

C++中的类成员一般会在构造函数中初始化,但是它一般有两种初始化方式:1.放在初始化列表中;2.放在构造函数体中。
这两种初始化方式有什么异同?各有什么好处?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(6

归属感 2017-10-26 6 楼

初始化列表才叫初始化,在函数体中叫复制
const成员和引用成员只能被初始化而不能被赋值。
没有默认构造函数的对象,也只能在初始化列表中初始化。
在初始化列表中初始化可以提高效率。
在函数体中赋值。
是已经调用了默认的构造函数,然后再调用赋值函数进行赋值的。
尽量的使用初始化列表而不是赋值。
详细的参考 Effectiv C++条款12
http://www.kuqin.com/effectivec2e/ch03c.htm

想挽留 2017-10-21 5 楼

我前段时间针对这个方面总结过,写了一篇博客,你可以参考一下:
类的成员初始化表与构造函数内赋值操作

晚风撩人 2017-10-14 4 楼

在初始化列表中的成员实际上在构造函数调用前就已经获得了初值,如果当前类是一个派生类,则使用初始化列表还有一个作用就是显式调用基类的构造函数初始化基类部分(如果基类有带参数的构造函数的话)。

归属感 2017-10-13 3 楼

一般来说会在构造函数中初始化的东西可能包括以下7种:
1.直接父类。
2.虚基类。
3.常量型成员变量。
4.引用型成员变量。
5.“非常量”、“非引用”、但“具有非缺省构造函数的”用户自定义类型的成员变量。
6.“非常量”、“非引用”的标量型成员变量,或者叫“常规的”成员变量。
7.数组作为成员变量。

建议是:
1.第7种,即数组成员不可能在初始化列表中初始化,只能在函数体中初始化。
2.第6种,即常规的标量成员变量,两个地方都可以。
3.前面5种,必须在初始化列表中初始化。

这样的初始化方式主要是为了保证构造函数初始化的正确性和高效性,在初始化列表中初始化是高效的,是真正的初始化,但是在函数体中的“初始化”,其实是赋值而非初始化。

对于常规的标量成员变量,这种区别不是很明显。但是对于用户自定义类型来说,如果在构造函数体中进行“初始化”就有可能付出高昂的代价。这种代价的原因是函数体中的“初始化”其实是赋值,而这种赋值是发生在成员既有的构造行为之后(标量除外),如果这种构造是非平凡的,其本身就已经付出了运行期代价,并且有一个代价高昂的赋值操作的话,就会使“初始化”的代价加倍。

晚风撩人 2017-10-11 2 楼

最好放在初始化列表 因为可能有依赖 初始化会严格按照列表顺序执行!!!

泛泛之交 2017-09-28 1 楼

1.初始化列表中的成员先于构造函数中的内容执行。
2.const成员变量必须在初始化列表中初始化。
建议阅读《深入探索C++对象模型》,是一本非常好的书,里面有专门讲解构造函数、拷贝构造函数、赋值运算符、析构函数的编译器实现机制的章节,讲的很细很清楚。