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


相关推荐

  • 查看webpack版本_封装webpack

    查看webpack版本_封装webpacknpmwebpack-v转载于:https://www.cnblogs.com/aiyr/p/10562244.html

    2022年8月9日
    6
  • mysql 面试题 查询出表中某字段的重复值

    mysql 面试题 查询出表中某字段的重复值

    2021年11月10日
    42
  • 扫描web漏洞的工具_系统漏洞扫描工具有哪些

    扫描web漏洞的工具_系统漏洞扫描工具有哪些十大Web漏洞扫描工具AcunetixWebVulnerabilityScanner[(简称AwVS)AwVS是一款知名的Web网络漏洞扫描工具,它通过网络爬虫测试你的网站安全,检测流行安全漏洞。a)、自动的客户端脚本分析器,允许对Ajax和Web2.0应用程序进行安全性测试b)、业内最先进且深入的SQL注入和跨站脚本测试c)、高级渗透测试工具,例如HTTPEditor和HTTPFuzzerd)、可视化宏记录器帮助您轻松测试web表格和受密码保护的区域e)、支持含有CAPT

    2025年8月30日
    10
  • Navicat 15 for MySQL 激活码(破解版激活)

    Navicat 15 for MySQL 激活码(破解版激活),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    179
  • Echarts 关系图谱示例「建议收藏」

    Echarts 关系图谱示例「建议收藏」<!DOCTYPEhtml><html><head><metaname=”viewport”content=”width=device-width”/><title>ECharts关系图谱</title><scriptsrc=”jquery-1.10.2.min.js”></script><scriptsrc=”echarts.min.js”>.

    2022年6月26日
    28
  • 订单支付相关问题总结

    订单支付相关问题总结最近公司商城系统要重做,我接手了支付相关的需求,发现里面弯弯绕绕的地方还是有不少的,所以把碰到的问题记录一下。支付问题在第一次对接微信支付时,生成预支付单的接口会让使用微信商家平台的API密钥进行加签,但是就算你使用的API密钥确定没有问题,也可能会返回验签失败,一点办法也没有。解决方法:使用UUID重新生成了32位纯小写的密钥(我怀疑就是密钥格式问题引起的,从来没有见过密钥让用户手…

    2022年6月6日
    23

发表回复

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

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