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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pytest fixtures_pytest conftest.py文件

    pytest fixtures_pytest conftest.py文件fixture的优势Pytest的fixture相对于传统的xUnit的setup/teardown函数做了显著的改进:命名方式灵活,不局限于setup和teardown这几个命名conf

    2022年7月31日
    8
  • linux双系统默认进入win10,win10 linux 双系统 默认win10启动

    linux双系统默认进入win10,win10 linux 双系统 默认win10启动双系统怎么设置Win10系统为默认启动系统。Win10一出来,我就去安装尝试了,在自己电脑上安装了Win10双系统。安装后Win10就是默认启动系统了,那么要想让以前的系统为默认系统怎么设置呢,今天我就给大家介绍下Win10双系统怎么设置默认启动系统。1、在Win10系统下同时按下组合键“Win+R”,打开运行工具,输入“msconfig”,然后点击确定,如下图所示。2、在系统设置界面上点击“引导…

    2022年7月24日
    10
  • 虚拟机 VMware 中安装 Ubuntu[通俗易懂]

    准备工作Ubuntu获取地址:官网:https://www.ubuntu.com/download/server清华镜像站:https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/18.04/VMware获取地址:链接:https://pan.baidu.com/s/16f_ka1BnfQkQRxxTbyCYK…

    2022年4月8日
    42
  • 【Python_环境配置】Pycharm创建虚拟环境

    【Python_环境配置】Pycharm创建虚拟环境问题由来从github下载的模型程序,所适包的版本不同,导致Pycharm中包混乱、版本冲突。 为每个程序单独创建虚拟环境,使得特定程序只能访问虚拟环境中的包,从而保持全局解释器的干净整洁。创建虚拟环境File-Settings-PythonInterpreter-设置图标,后续设置如下:Pycharm之创建虚拟环境在特定虚拟环境中安装包1、选择下方Terminal2、利用cd进入项目的Scripts文件夹3、输入activate4、利用pip命…

    2025年6月26日
    0
  • mysql查询语句select-(null,not null,is null和is not null)

    mysql查询语句select-(null,not null,is null和is not null)1一些概念  1.1null与notnull  null和notnull是mysql的字段属性,或称为数据类型的属性,不属于任何类型。null值也不等同于空值,空值是不占用存储空间的,null占用存储空间,如对myisam表占用1bit额外存储空间。  1.2isnull与isnotnull  isnull和isnotnull是mysq

    2022年6月1日
    124
  • Java守护线程「建议收藏」

    Java守护线程「建议收藏」1、什么是守护线程Java线程分两种:用户线程和守护线程。守护线程,是指在程序运行的时,后台提供一种通用服务的线程。比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。守护线程和用户线程的没有本质的区别,不同之处在于虚拟机的离开;若用户线程已全部退出运行,只剩守护线程存在,虚拟机也即退出。因没有了被守护者,守护线程也就无工作可做,也

    2022年10月15日
    0

发表回复

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

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