码农知识堂 - 1000bd
Python
PHP
JS/TS
JAVA
C/C++
C#
GO
Kotlin
Swift
条例11~12(构造/析构/赋值函数)
条例11
在operator=中处理自我赋值
重载赋值操作符的时候要记得考虑自我赋值的情况,虽然没有意义但语法是合法的。
假如你的赋值操作先把被赋值对象删除(防止原先的值内存泄漏)再重新对其进行赋值的话,若这时候不特殊处理,在自我赋值的时候就会出现野指针问题。可以通过正通测试(判断地址是否相同)来处理
若我们注意异常安全性就可以直接避免这些问题。例如我们提前保存下来要删除的指针,在修改后再删除就能天然避免这些问题。
若想提高效率可以采用现代写法。在赋值操作内创建一个新的要拷贝的值(调用拷贝构造),在通过swap交换当前值和新构造的值,这样新创建的对象在生命周期结束时会自动析构当前值。
若想进一步优化,可以在传参的时候不使用引用传参,这样就不用调用拷贝构造创建新的变量,可以直接交换传进来的值。这样能充分利用传参时形成的拷贝构造。
总结
应当确保赋值操作有良好的行为。
确保自己赋值时行为仍然正确。
条例12
复制对象时不能忘记其每个成分
若你自己创建了一个类,并实现了拷贝构造和拷贝赋值。若此时你在类内新增加了一个成员变量,且忘记更改拷贝构造的时候,这时候拷贝构造执行的就是局部拷贝,由于你自己生成了拷贝函数,编译器不会生成拷贝函数也不会检查你的拷贝函数是否完全。
这个问题在继承里也会出现。有可能出现子类成员被拷贝了,但父类成员没被拷贝的情况。这时就要主动调用父类成员的拷贝函数。
用拷贝构造复用拷贝赋值是没有意义的。拷贝构造是用来初始化新对象的。赋值是在已经创建的对象上赋值。对没被构造的函数赋值没有意义。
总结
拷贝函数应该保证赋值对象内所有成员变量,以及所有父类成员的成分(调用父类成员的拷贝函数)
不要尝试在拷贝构造和拷贝赋值之间相互复用,应该向共同技能放在第三方函数内,用两个函数共同调用。
相关阅读:
第二章 基本数据类型与数组
多云管理产品组合VMware Aria,开启多云管理新篇章
Java反射技术
深度学习之生成唐诗案例(Pytorch版)
前端面试-React专题
【多卡训练报错】:The server socket has failed to listen on any local network address.
删除Github仓库中的指定的文件或文件夹
SharePoint 非365版本接入简要笔记
用HTML+CSS做一个漂亮简单的轻量级图片相册博客网站(web前端期末大作业)
前后端交互案例分析
原文地址:https://blog.csdn.net/m0_62572672/article/details/133097814
最新文章
攻防演习之三天拿下官网站群
数据安全治理学习——前期安全规划和安全管理体系建设
企业安全 | 企业内一次钓鱼演练准备过程
内网渗透测试 | Kerberos协议及其部分攻击手法
0day的产生 | 不懂代码的"代码审计"
安装scrcpy-client模块av模块异常,环境问题解决方案
leetcode hot100【LeetCode 279. 完全平方数】java实现
OpenWrt下安装Mosquitto
AnatoMask论文汇总
【AI日记】24.11.01 LangChain、openai api和github copilot
热门文章
十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
奉劝各位学弟学妹们,该打造你的技术影响力了!
五年了,我在 CSDN 的两个一百万。
Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
面试官都震惊,你这网络基础可以啊!
你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
心情不好的时候,用 Python 画棵樱花树送给自己吧
通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
13 万字 C 语言从入门到精通保姆级教程2021 年版
10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系
2656653265@qq.com
京ICP备2022015340号-1
正则表达式工具
cron表达式工具
密码生成工具
京公网安备 11010502049817号