重载赋值运算符(解决指针悬挂)

—— (与拷贝构造函数结合起来理解)

c++中,对于任何一个类,如果没有用户自定义的赋值运算符函数,系统会自动的为其生成一个默认的赋值运算符函数,以完成数据成员之间的逐位复制。通常情况下,默认的赋值运算符函数可以完成赋值任务,但在类中含有指针的特殊情况下,就不能直接互相赋值,因为有可能造成指针悬挂。

指针悬挂问题

解决方法:重载赋值运算符解决指针悬挂问题

引出一个简单的例子:

#include<iostream>
#include<cstring>
using namespace std;class Student
{private:char *name ;int num;
public:Student(char *na, int n){name = new char[strlen(na) + 1];strcpy(name, na);num = n;}Student &operator=(const Student &p){//判断是不是p1给自己赋值 避免p1=p1的赋值if (this == &p)return *this;delete[] name;name = new char[strlen(p.name) + 1];strcpy(name, p.name);num = p.num;return *this;}~Student(){delete[] name;}void Print(){cout << name << "  " << num << endl;}
};
int main()
{Student p1("zhang", 5);Student p2("wang", 6);cout << "     p2:  ";p2.Print();p2 = p1;cout << "修改后p2: ";p2.Print();return 0;
}

运行结果
p2:wang 6
修改后p2:zhang 5

可见已经完成的赋值过程,如图解:

注意:
(1)赋值运算符不能重载为友元函数,只能重载为一个非静态成员函数。这是由于考虑了c++的封装性和数据的安全性。一般而言,用友元函数重载比用成员函数重载更便于使用。
(2)赋值运算符不能被继承。

拷贝构造函数

c++不仅可以用构造函数来创建对象,也可以通过已有对象创建新对象。可用一个已有对象来给另一个对象赋值,对象进行赋值时,对象的每一个成员逐一复制给另一个对象的同一成员。所以,在有类对象的传值情况下需要用到拷贝构造函数。在参数传递的过程中,是由实参将自己的值复制了一份传给形参,采用按位拷贝的方式,所以在传递的过程中,并不会再创建一个新的类对象。为了防止一个对象不被通过传值方式传递,需要声明一个私有的拷贝构造函数。
注意: 拷贝构造函数的定义格式如下:只能使用引用的方式,原因是防止无限递归调用。
构造函数名(const 类名&)

在拷贝函数和重载赋值运算符函数同时存在的情况下,会直接调用赋值运算符函数。

【C++】重载赋值运算符相关推荐

  1. C++ 拷贝构造函数和重载赋值运算符的区别

    文章目录 拷贝构造函数 重载赋值运算符 赋值运算符和拷贝构造函数最大区别是赋值运算符没有新的对象生成,而拷贝构造函数会生成新的对象. 为了更加形象 准确得描述 赋值运算符和拷贝构造函数得区别,将详细通 ...

  2. C++中重载赋值运算符=

    1.C++重载=(赋值运算符) 在定义的同时进行赋值叫做初始化(Initialization),定义完成以后再赋值(不管在定义的时候有没有赋值)就叫做赋值(Assignment).初始化只能有一次,赋 ...

  3. C++ 类的深拷贝与浅拷贝||深拷贝通过重载拷贝构造函数与重载赋值运算符实现

    http://blog.csdn.net/wangshihui512/article/details/9842225 在面向对象程序设计中,对象间的相互拷贝和赋值是经常进行的操作. 如果对象在申明的同 ...

  4. C++ 重载赋值运算符

    在定义的同时进行赋值叫做初始化(Initialization),定义完成以后再赋值(不管在定义的时候有没有赋值)就叫做赋值(Assignment).初始化只能有一次,赋值可以有多次. 当以拷贝的方式初 ...

  5. 《剑指offer》第一题(重载赋值运算符)

    //重载赋值运算符 #include <iostream> #include <cstring> using namespace std;class CMystring { p ...

  6. c语言赋值运算符 amp amp 怎么读,重载赋值运算符 amp;amp; 对象

    classCMessage {private:char *m_pMessage;public:void showIt()const{ cout<< m_pMessage < }//构 ...

  7. c++学习笔记(12) 需要对对象做拷贝时(深拷贝,浅拷贝),如何重载赋值运算符

    在c++学习笔记(8)中,介绍了拷贝构造函数的概念:涉及到深拷贝和浅拷贝的概念: 拷贝构造函数:每一个类都有一个都有一个拷贝构造函数,用于拷贝对象.拷贝构造函数可以用来创建一个对象,并用另一个对象的数 ...

  8. 【带你吃透C++】运算符重载(赋值运算符重载)原来是这么一回事

    look here 运算符重载 赋值运算符重载 细节总结: – the End – 运算符重载 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,其目的就是让自定义类型可以 ...

  9. 区分一下强制类型转换运算符重载/赋值运算符重载/对象定义的赋值

    这三个名字可能很绕,看着也很不一样,但其实是三个很容易混淆的概念,并且经常在实际编程中遇到.这里拿出来比较一下. 首先是强制类型转换运算符的重载,作用是当前对象向其他类型的转换,常见的形式是 oper ...

最新文章

  1. 2021年洛谷一月月赛(Div1、Div2,6题)全部题解
  2. ASP.NET知识点:母版页的路径问题
  3. SpringMQ的使用
  4. Statement对象
  5. 内存不够用还要速度快,终于找到可以基于 File 的 Cache 了
  6. Shadow Defender 语言文件并注册
  7. 5G对人体危害很大?张朝阳回应:并未做过深入研究
  8. java 发送邮件_SpringBoot 2.1.5发送验证码邮件
  9. VC890D万用表弹片图片
  10. 记一次项目经验(4)
  11. 定义雇员类Employee
  12. Php微云解析,更新微云网盘解析规则
  13. vscode ssh遇到“过程试图写入的管道不存在”问题
  14. 数据防泄漏 | 禁止PrintScreen键
  15. 微信热搜榜、订阅热词API
  16. 从一个微服务应用的成功落地,谈企业需要什么样的微服务治理
  17. iFixit:苹果AirTag拆解,内部结构紧凑
  18. SMVC4: JSON文件的使用
  19. 方格1010+颠覆经典俄罗斯方块逻辑玩法的手游
  20. 语音差分编码(DPCM)的实现与改进——Python实现

热门文章

  1. 小程序:自定义组件的实现方法及自定义组件与页面间的数据传递
  2. [转载]Web 研发模式演变
  3. java 把文件转化为字节数组
  4. python执行shell命令
  5. 让开发人员变平庸的八个习惯,看看你中了几条
  6. Oracle数据库之间数据同步 -- DBLink
  7. Windows10 环境下Jupyter Notebook的安装与使用
  8. 【Java】利用循环嵌套实现输出一天的小时和分钟
  9. 【Python】体育竞技分析
  10. C 语言实例 - 判断三边能否构成三角形