十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这篇文章主要介绍“C++11中怎么将=default用于拷贝控制成员”,在日常操作中,相信很多人在C++11中怎么将=default用于拷贝控制成员问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++11中怎么将=default用于拷贝控制成员”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
创新互联公司是专业的黑山网站建设公司,黑山接单;提供网站设计、成都网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行黑山网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
编译器自动生成的操作
有一定经验的C++程序员都会知道,C++编译器会自动生成一些默认操作:
默认构造函数
析构函数
拷贝构造函数
赋值运算符
移动构造函数
移动赋值运算符
这些操作被分为两组:默认构造函数自己为一组,其他的5个为一组。
如果程序员定义了任意的构造函数,编译器就不再生成默认构造函数。
后面5个操作被分为一组,称作拷贝控制成员,用于处理类对象(拷贝)的复制,赋值和销毁。注意这里的拷贝是名词而不是动词。如果程序员定义了5个成员中的任意一个,编译器就不会自动生成其他的成员。
作者的理解
为什么要这样分组呢?这里分几种情况讨论。
简单的数据类
这时类的功能和C语言的结构体类似,类本身没有功能,甚至不会定义构造函数。这种情况下,C++编译器会自动生成默认构造函数,数据成员的值执行默认初始化。
虽然默认初始化的结果不一定就是程序员想要的,但是一般也不会有什么问题:程序员会另外赋值。
没有资源管理的功能类
和简单数据类相比,这种类比简单数据类增加了相应的内部逻辑,因此数据成员之间也会有一些内在的联系。这时默认初始化往往就不能满足要求了,解决方法就是定义构造函数。
作为C++编译器,一旦程序员定义了构造函数,就可以认为默认初始化已经不能满足程序员的需求而不再生成默认的构造函数了。这种处理方式在大多数情况下会更安全。
C++11以后,如果程序员还是希望编译器生成默认构造函数,可以通过=default来实现。
由于不存在资源管理的需求,这个类还不是必须定义析构函数。
包含资源管理的功能类
一旦类中包含了需要释放的资源,如内存,端口,文件等,就需要定义一个析构函数来释放这些资源。析构函数在对象销毁时被自动调用,正好可以完成这个任务。一般来讲,一旦析构函数中需要释放资源,在其他的拷贝控制成员也需要进行相应的处理。
和自动生成默认构造函数的规则类似,如果程序员定义了某个拷贝控制成员,编译器就不再自动生成其他的。
当然也存在像浅拷贝那样,编译器生成的拷贝控制成员就可以满足需求的情况,这时可以对拷贝控制成员使用=default要求编译器生成某些拷贝控制成员。
这就是本文的标题。
实例
老鸟的疑惑
如果你是C++老鸟,也许你会说,关于拷贝控制成员的生成规则,我用的C++编译器并不是这样的呀?
这一点,请看权威书籍的解释:
不幸的是,第二条规则不是完整施行的:出于向后兼容的需求,即使程序员定义了析构函数,编译器还是会自动生成拷贝构造函数和拷贝赋值运算符。但是这一特征在ISO标准中已经启用了,你可以期望一个现代编译器能对此给出警告。
到此,关于“C++11中怎么将=default用于拷贝控制成员”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!