C++11新特性(47)- 将=default用于拷贝控制成员
发布日期:2021-07-01 05:34:13 浏览次数:2 分类:技术文章

本文共 1285 字,大约阅读时间需要 4 分钟。

本文中的内容有的可以从C++的经典书籍中找到根据,有的是作者的理解。将些内容结合在一起,作者希望可以对这个问题有一个完整的表述:知其然,还要知其所以然。
编译器自动生成的操作
有一定经验的C++程序员都会知道,C++编译器会自动生成一些默认操作:
1.默认构造函数
2.析构函数
3.拷贝构造函数
4.赋值运算符
5.移动构造函数
6.移动赋值运算符
这些操作被分为两组:默认构造函数自己为一组,其他的5个为一组。
如果程序员定义了任意的构造函数,编译器就不再生成默认构造函数。
后面5个操作被分为一组,称作拷贝控制成员,用于处理类对象(拷贝)的复制,赋值和销毁。注意这里的拷贝是名词而不是动词。如果程序员定义了5个成员中的任意一个,编译器就不会自动生成其他的成员。
作者的理解
为什么要这样分组呢?这里分几种情况讨论。
简单的数据类
这时类的功能和C语言的结构体类似,类本身没有功能,甚至不会定义构造函数。这种情况下,C++编译器会自动生成默认构造函数,数据成员的值执行默认初始化。
虽然默认初始化的结果不一定就是程序员想要的,但是一般也不会有什么问题:程序员会另外赋值。
没有资源管理的功能类
和简单数据类相比,这种类比简单数据类增加了相应的内部逻辑,因此数据成员之间也会有一些内在的联系。这时默认初始化往往就不能满足要求了,解决方法就是定义构造函数。
作为C++编译器,一旦程序员定义了构造函数,就可以认为默认初始化已经不能满足程序员的需求而不再生成默认的构造函数了。这种处理方式在大多数情况下会更安全。
C++11以后,如果程序员还是希望编译器生成默认构造函数,可以通过=default来实现。
由于不存在资源管理的需求,这个类还不是必须定义析构函数。
包含资源管理的功能类
一旦类中包含了需要释放的资源,如内存,端口,文件等,就需要定义一个析构函数来释放这些资源。析构函数在对象销毁时被自动调用,正好可以完成这个任务。一般来讲,一旦析构函数中需要释放资源,在其他的拷贝控制成员也需要进行相应的处理。
和自动生成默认构造函数的规则类似,如果程序员定义了某个拷贝控制成员,编译器就不再自动生成其他的。
当然也存在像浅拷贝那样,编译器生成的拷贝控制成员就可以满足需求的情况,这时可以对拷贝控制成员使用=default要求编译器生成某些拷贝控制成员。
这就是本文的标题
实例
老鸟的疑惑
如果你是C++老鸟,也许你会说,关于拷贝控制成员的生成规则,我用的C++编译器并不是这样的呀?
这一点,请看权威书籍的解释:
不幸的是,第二条规则不是完整施行的:出于向后兼容的需求,即使程序员定义了析构函数,编译器还是会自动生成拷贝构造函数和拷贝赋值运算符。但是这一特征在ISO标准中已经启用了,你可以期望一个现代编译器能对此给出警告。
----------C++ 程序设计语言 第四版 17.6小节
作者观点
好习惯最好从现在做起,做正确的事不需要理由。

以上就是今天的文章,欢迎点赞收藏并分享给更多的朋友!

阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】

转载地址:https://oothinking.blog.csdn.net/article/details/81020337 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:C++11新特性(48)- 使用=delete阻止拷贝类对象
下一篇:C++11新特性(46)- allocator::construct可使用任意构造函数

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月15日 22时49分12秒