【C++永不过时的语言】=运算符重载应注意点
发布日期:2021-06-29 14:30:10
浏览次数:3
分类:技术文章
本文共 1456 字,大约阅读时间需要 4 分钟。
文章目录
1.默认=运算符重载函数的局限
我们知道,当我们定义一个类A的时候,即使类体中我们什么都不写,C++编译器
也将自动为A 产生下面四个缺省函数
。
A(void); // 缺省的无参数构造函数A(const A &a); // 缺省的拷贝构造函数~A(void); // 缺省的析构函数A & operate =(const A &a); // 缺省的赋值=函数
本文主要讲=运算符的重载,因此暂且不去管其它三个函数,重心放在赋值运算符重载函数上。刚接触C++的同学可能会疑惑:既然编译器能自动生成=运算符重载函数了,为什么还要我们自己再去写了。
但是对于含有指针
的类,编译器自动生成的=重载函数就满足不了我们的需求了,
class String{ public: private: char *data; // 用于保存字符串};
上面的String类没有自定义=运算符重载函数,当我们在程序中对String对象进行赋值操作时。
String a("Hello");String b("World");b = a; //赋值操作
使用的是编译器自动生成
的=重载函数,该函数作用是将数据成员按bit拷贝,最后的结果是导致最后a和b指向同一块字符串"Hello",而b原来指向的字符串"World"现在没有主人。这样会导致以下几个问题。
(1) b原来指向的字符串"World"成了无主之魂,没有机会释放,造成内存泄露。(2) a,b现在指向同一字符串"Hello",可能会被释放2次,也会造成错误。(3) a,b现在指向同一字符串"Hello",通过a修改字符串会影响b,反之亦然,会导致不确定的行为产生。
2.防止自我拷贝
不少同学可能知道大部分情况编译器自动生成的=重载函数不够用,需要自己编写,于是毫不犹豫的写出了下面的=重载函数。
String& String::operator=(const String &rhs){ delete[] data; data = new char[strlen(rhs.data)+1]; strcpy(data, rhs.data); return *this;}
粗看之下好像确实没什么问题,其实我们可以考虑的更周全点,想想,如果代码中出现了下面的语句会出现什么情况呢?
String a("Hello");a = a; //自我赋值
我们来分析下,赋值操作中,会先把自己的数据delete掉,现在rhs.data及*this.data都成了野指针
,后面的strlen、strcpy操作就会产生不确定的行为。关于野指针,前面文章C/C++指针使用常见的坑(请戳我)有总结。
String& String::operator=(const String &rhs){ //防止自我赋值 if (this == &rhs) { return *this; } delete[] data; data = new char[strlen(rhs.data)+1]; strcpy(data, rhs.data); return *this;}
学如逆水行舟,不进则退
转载地址:https://chocolate.blog.csdn.net/article/details/104187697 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2024年04月20日 02时52分35秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
无人机破巡检难题,秒变电网卫士
2019-04-29
五年,我成为了一名嵌入式工程师。
2019-04-29
2020年电赛题目,命题专家们怎么看?
2019-04-29
PCB元器件摆放不可忽略的10个技巧
2019-04-29
掌握AI核心技术没有秘籍,能自己创造就是王道
2019-04-29
大学老师的月薪多少?实话实说:4万多一点……
2019-04-29
2020年电赛题目,命题专家权威解析!
2019-04-29
写论文,这个神器不能少!
2019-04-29
现在做硬件工程师还有前途吗?
2019-04-29
华为被超越!这家公司成中国最大智能手机制造商,不是小米!
2019-04-29
芯片为什么持续缺货?
2019-04-29
美国无人机在火星首飞成功,创造历史,3米飞行高度悬停30秒
2019-04-29
缺货涨价很久的MCU的国产和国外厂家汇总!(80家)
2019-04-29
华为重磅反击,鸿蒙来了!
2019-04-29
常用电子接口大全,遇到不认识的,就翻出来对照辨认!
2019-04-29
芯片IC附近为啥要放0.1uF的电容?
2019-04-29
电赛 | 19年全国一等奖,北航学子回忆录。
2019-04-29
电赛 | 19年全国一等奖,北航学子回忆录(上)
2019-04-29
电赛 | 19年全国一等奖,北航学子回忆录(下)
2019-04-29
突破!台积电1nm芯片,有了新进展。
2019-04-29