13.1.2 拷贝赋值运算符、析构函数、三/五法则、阻止拷贝

13.1.2 拷贝赋值运算符、析构函数、三/五法则、阻止拷贝

13.1.2 拷贝赋值运算符
1.拷贝赋值运算符就是重载赋值运算符调用operaotr =;如:Foo& operator = (const Foo&);返回值必须为引用类型
2.拷贝赋值运算符会将右侧运算符对象的每个非static成员赋予左侧对象,静态数据成员是公有的无须拷贝
3.只有整形常量数据成员才能在类内初始化,一般静态成员是在类外初始化。int Point::b = 0;静态数据成员的生存周期是从定义出开始到源程序结束。
13.1.3析构函数
1.一个类只有一个析构函数,析构函数释放对象在生存期内分配的所有资源,销毁成员时,成员按初始化顺序的逆序销毁。
2.隐式销毁一个内置指针类型的成员不会delete 它所指向的对象。需要在析构函数中显示的delete该指针。
3.一般情况下,析构函数的函数体为空,因为销毁内置类型成员什么也不需要做,析构函数自身并不直接销毁成员销毁各种类型的成员需要指向成员自己的析构函数,成员是在析构函数体之后隐含的析构阶段被销毁的。
4.当指向一个对象的引用或指针离开作用域时,析构函数不会执行,因为对象并未离开作用域。
5.析构函数情况:
(1)变量在离开作用域是被销毁
(2)当一个对象被销毁时,其成员被销毁
(3)容器(无论是标准库容器还是数组)被销毁时,其元素被销毁
(4)对于动态分配的对象,当对指向它的指针应用delete运算符时被销毁
(5)对于临时对象,当创建它的完整表达式结束时被销毁
13.1.4三/五法则
1.三指的是“拷贝构造函数”,“拷贝赋值运算符”,“析构函数”,五指的是前面三条加上接下来的两条规律:
(1)需要析构函数的的类也需要拷贝和赋值操作,因为需要自定义析构函数时说明类内有像指针这样比较难的数据成员,而这些成员的拷贝如果依靠合成的拷贝和赋值操作往往会出错。
(2)需要拷贝操作的类同时也需要赋值操作,反之亦然,但不一定要析构函数
13.1.5 使用=default
我们可以通过将拷贝控制成员定义为=default 来显示地要求编译器生成合成的版本:
class Sales_data {

public:
Sales_data() = default;
Sales_data(const Sales_data&) = default;
Sales_data& operator = (const Sales_data&);
~Sales_data() = default;
};
Sales_data& Sales_data::operator = (const Sales_data&) = default;
如果我门在类内使用=default修饰成员的声明时,合成的函数将隐式的声明为内联的,如果我们不希望合成的成员是内联的,应该将=default移至类外声明,就像拷贝赋值运算符所做的那样。
但是只有具有合成版本的成员函数才能使用=default。
13.1.6阻止拷贝
1. 大多数类应该定义默认构造函数,拷贝控制成员,无论是隐式的或显示的
2. 阻止拷贝就是有时我们么不希望该类有某些操作,比如拷贝控制操作或其它任何函数,声明一个删除的函数只需在成员声明时在参数列表之后加上= delete或将其声明语句放在private说明符的作用方位之内。
3. 我们不能将某个类的或该类的成员的析构函数声明成删除的函数,因为这样的话,我们的对象或成员就无法被释放,所以一旦做了这个操作,就不允许定义或创建对象或临时对象。但是我们可以动态分配这种类型的对象,但是不能释放这些对象。
4. 合成的拷贝控制成员可能是删除的
(1)如果类的某个成员的析构函数时删除的或private的,则类的合成析构函数被定义为删除的。
(2)如果类的某个成员拷贝构造函数或析构函数是删除的或private的,则类的合成拷贝控制成员被定义为删除的。
(3)如果类的某个成员的拷贝赋值运算符是删除的或private的,或类的成员有一个是const或引用成员,则类的合成拷贝赋值运算符被定义为删除的。
(4)如果类的某个成员的析构函数是删除的或private的,或类的成员有一个是const或引用成员,且该成员没有类内初始化器且该类没有显示定义默认构造函数,则该类的默认构造函数被定义为删除的。

转载于:https://www.cnblogs.com/hi3254014978/p/9412293.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101507.html原文链接:https://javaforall.net

(0)
上一篇 2021年6月10日 上午9:00
下一篇 2021年6月10日 上午10:00


相关推荐

  • 解决:navicat for mysql连接失败[通俗易懂]

    解决:navicat for mysql连接失败[通俗易懂]1、问题描述:在navicatformysql连接mysql8.0.23时,出现如下错误。2、原因:通过百度翻译,发现是由于navicat版本的问题,出现连接失败的原因。这也就是说需要升级navicat版本。通过搜索,发现navicat是收费的,升级将会面临其他不可控的问题。于是需要寻找其他方法。通过查阅资料以及他人的经历分享。我得知了:mysql8之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password

    2022年10月14日
    6
  • SVM SMO算法代码详细剖析

    SVM SMO算法代码详细剖析算法实现一:本文要结合SVM理论部分来看即笔者另一篇https://blog.csdn.net/weixin_42001089/article/details/83276714二:有了理论部分下面就是直接代码啦,本文用四部分进行介绍:最简版的SMO,改进版plattSMO,核函数,sklearn库的SVM,四部分以%%%%%%%分开,采取的顺序是先给代码及结果,然后分析三:这里代码大…

    2022年6月17日
    37
  • placeholder 与variable

    placeholder 与variableplaceholder,译为占位符,官方说法:”TensorFlowprovidesaplaceholderoperationthatmustbefedwithdataonexecution.”即必须在执行时feed值。placeholder实例通常用来为算法的实际输入值作占位符。例如,在MNIST例子中,定义输入和输出:x=tf.placeholder(tf…

    2022年7月15日
    16
  • 概要设计和详细设计说明书的区别

    概要设计和详细设计说明书的区别1.需求分析–产生软件功能规格说明书,需要确定用户对软件的需求,要作到明确、无歧义。不涉及具体实现方法。用户能看得明白,开发人员也可据此进行下面的工作(概要设计)。     2.概要设计–产生软件概要设计说明书,说明系统模块划分、选择的技术路线等,整体说明软件的实现思路。并且需要指出关键技术难点等。       3.详细设计–产生软件详细设计说明书,对概要设计的进一步细化,一般由各部

    2022年6月9日
    36
  • 请说下封装 vue 组件的过程?_组件二次封装的必要性

    请说下封装 vue 组件的过程?_组件二次封装的必要性vue组件的定义●组件(Component)是Vue.js最强大的功能之一●组件可以扩展HTML元素,封装可重用代码●在较高层面上,组件是自定义元素,Vue.js的编译器为他添加特殊功能●有些情况下,组件也可以表现用is 特性进行了扩展的原生的HTML元素●所有的Vue组件同时也都是Vue实例,所以可以接受相同的选项对象(除了一些根级特有的选项),并提供相同的生命周…

    2026年3月3日
    4
  • ubuntu 18.04 安装pdman

    ubuntu 18.04 安装pdmanhttp www pdman cn 这里可以下载到安装包 可以试试这是码云地址 https gitee com OAGroup pdman 环境要求 node 8 11 3npm 5 6 01 安装 nodejs npm sudoapt getinstallno 升级到最新版 sudonpminsta

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号