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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • linux编辑文件命令vim怎么退出_vim退出不保存的命令

    linux编辑文件命令vim怎么退出_vim退出不保存的命令Linux(Ubuntu)vim编辑器保存退出命令进入vim编辑器,输入i进入编辑状态按esc退出编辑常用的保存退出命令如下:1、:w(保存编辑的文件内容,但不退出vim编辑器)2、:w!(强制写文件,即覆盖原有的文件,如果原有文件的访问权限不允许写入文件,例如,原有的文件为只读文件,则可使用这个命令强制写入)3、:q(未做任何编辑,无需保存文件,直接退出vim编辑器)4、:q!(强制退出vim编辑器,适用于已写入内容但不需要保存放弃该内容时)5、:wq(保存编辑的文件并退出vim编辑器

  • SpringBoot 源码解读

    SpringBoot 源码解读Springboot之前出现的问题Spring框架需要进行大量的配置项目的依赖管理冲突为什么是SpringBootSpringBoot本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。也就是说,它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具。…

  • idea方法注解快捷键_idea生成方法的快捷键

    idea方法注解快捷键_idea生成方法的快捷键人工智能,零基础入门!http://www.captainbed.net/inner对于实体Bean类,比较多繁杂的重复代码内容,比如说get/set方法和toString方法,对于这些idea都是有快捷键的,介绍一下toString方法的自动生成:【1】把光标移到最下面:【2】按键盘alt+insert键,找到toString选项:【3】然后就自动生成了:…

  • 学习笔记 python取余[通俗易懂]

    学习笔记 python取余[通俗易懂]python中的取余运算其实就是取模运算,所谓取模运算,就是计算两个数相除之后的余数,符号是%。如a%b就是计算a除以b的余数。用数学语言来描述,就是如果存在整数n,其中0<=|m|<|b|使得a=n*b+m,那么a%b=a‐n*b=m其中n=a/b,然后对n进行向下取整,最后得到n取模运算的两个操作数都必须是整数,可以是负整数,但是b不可以是0,因为被除数不能为0假设变量:a=10,b=20;那么b%a输出结果0…

  • 怎么新建pytest的ini文件_qt读写配置文件

    怎么新建pytest的ini文件_qt读写配置文件前言pytest配置文件可以改变pytest的运行方式,它是一个固定的文件pytest.ini文件,读取配置信息,按指定的方式去运行查看pytest.ini的配置选项pytest-h找到以下

  • cxf实现webservice_简单框架

    cxf实现webservice_简单框架原文地址

发表回复

您的电子邮箱地址不会被公开。

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