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


相关推荐

  • 越狱版本打包方法

    越狱版本打包方法编译完了的程序是xxx.app文件夹,我们需要制作成ipa安装包,方便安装找一个不大于500*500的png图片(程序icon图标即可),改名为:iTunesArtwork,注意不能有后缀名。建立一个文件夹,名为:Payload,把刚才编译的xxx.app拷贝到这个文件夹里面。然后选中Payload和iTunesArtwork,右键生成压缩zip文件,比如:xxx.zip,把

    2022年5月22日
    50
  • Java 位运算(移位、位与、或、异或、非) 以及负数的二进制相互计算

    Java 位运算(移位、位与、或、异或、非) 以及负数的二进制相互计算Java 位运算(移位、位与、或、异或、非) 以及负数的二进制相互计算

    2022年4月23日
    42
  • 电容分类和作用_电容的识别

    电容分类和作用_电容的识别硬件基础知识—电容分类智能硬件和物联网产品上,工作电压不高,其常用的电容根据不同的工艺,主要分为陶瓷电容、电解电容和钽电容。↑陶瓷电容的结构图↑电解电容的结构图不管是什么电容,都是两组金属片夹着一层介质。陶瓷电容把金属片交错摆放,电解电容把金属片卷成柱状。↑片状陶瓷电容↑贴片陶瓷电容陶瓷电容,MultilayerCeramicCapacitor(MLCC),陶瓷电容的电介质是陶瓷,所以叫做陶瓷电容。陶瓷电容容值小、电压高、尺寸小、高频性能好、不区分正.

    2022年8月22日
    5
  • aix 关闭端口

    aix 关闭端口关掉对应的应用程序,则端口就自然关闭了,如:"kill-9PID"(PID:进程号)如:   通过"netstat-anp|grepssh"有显示:   tcp0127.0.0.1:21210.0.0.0:*LISTEN7546/ssh则:   "kill-97546" 1.netstat-Aan|grep<portnumber>…

    2022年7月20日
    13
  • ftp命令用法_FTP常用命令的使用方法

    ftp命令用法_FTP常用命令的使用方法1.登录:ftp192.168.xx.xx回车后输入用户名和密码或者直接输入ftp回车再输入open192.168.XX.XX2.常用命令:ls和dir显示文件列表cd目录和cd…切换ftp服务器路径lcd切换本地目录put和get上传、下载文件send上

    2022年9月2日
    0
  • Promise.all的深入理解「建议收藏」

    Promise.all的深入理解「建议收藏」异步之PromisePromise.allPromise.all接收的promise数组是按顺序执行的还是一起执行的,也就是说返回的结果是顺序固定的吗?目前有两种答案:应该是同步执行的,但是这样就有效率问题了,如果想改成异步执行怎么办呢?有些人认为结果是按顺序执行的,有些人认为结果顺序不确定。那么我们根据实现来解密:环境为:vscode1.20….

    2022年5月24日
    56

发表回复

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

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