资讯专栏INFORMATION COLUMN

赋值运算符重载函数不加&为什么会出错?

BLUE / 1508人阅读

摘要:先说结论不加,形参是一个对象,这会形成一个临时对象,会调用拷贝构造函数发生浅拷贝问题。拷贝构造函数调用啦看一下运行结果没有任何问题

赋值运算符重载函数不加&为什么会出错?

void operator=(Add n){}

在赋值运算符重载的时候,这个重载函数的参数到底需不需要加&呢?不加&会发生什么?

#include using namespace std;class Add{public:	Add(int n)	{		m_Num = new int(n);	}	void operator=(Add n)	{		if (this->m_Num != NULL)		{			delete this->m_Num;			this->m_Num = NULL;		}		this->m_Num = new int(*n.m_Num);	}	~Add()	{		if (m_Num != NULL)		{			delete m_Num;			m_Num = NULL;		}		}	int* m_Num;};void test01(){	Add n1(10);	Add n2(20);	n1 = n2;	cout << *n1.m_Num << endl;	}int main(){	test01();	return 0;}

让我们来运行一下上述代码,看看发生了什么:

程序显然已经崩溃了,怎么出现了这个错误呢?我们试一试加了&是什么样子?

看一下结果:

可以看到程序正常运行,也没有发生崩溃现象。

先说结论:不加&,形参是一个对象,这会形成一个临时对象,会调用拷贝构造函数发生浅拷贝问题。这个临时对象析构完,原本对象的n_Num指针维护的区域已经被释放掉了,原本对象再进行析构的时候又会再释放一次,那么这个程序就崩溃了。

那么不加&可以吗?可以的,但是要自己写一下拷贝构造函数,在形参拷贝临时对象时变成深拷贝就?啦。

#include using namespace std;class Add{public:	Add(int n)	{		m_Num = new int(n);	}	Add(const Add& n)	{		cout << "拷贝构造函数调用啦" << endl;		m_Num = new int(*n.m_Num);	}	void operator=(Add n)	{		if (this->m_Num != NULL)		{			delete this->m_Num;			this->m_Num = NULL;		}		this->m_Num = new int(*n.m_Num);	}	~Add()	{		if (m_Num != NULL)		{			delete m_Num;			m_Num = NULL;		}		}	int* m_Num;};void test01(){	Add n1(10);	Add n2(20);	n1 = n2;	cout << *n1.m_Num << endl;	}int main(){	test01();	return 0;}

看一下运行结果:

没有任何问题!!!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/119007.html

相关文章

  • JS数据类型&amp; 判断

    摘要:的数据类型,共有六种。通常,数值字符串布尔值这三种类型,合称为原始类型的值,即它们是最基本的数据类型,不能再细分了。运算符返回一个布尔值,表示某个对象是否为指定的构造函数的实例。 以下内容摘自阮一峰-JavaScript-标准参考教程 数据类型 JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型,共有六种。(ES6 又新增了第七种 Symbo...

    zhangxiangliang 评论0 收藏0
  • Python词典查找数据的5个基本操作步骤

      Python词典是另一个可变性器皿实体模型,并可存放随意种类目标,如字符串数组、数据信息、数组等其它器皿实体模型,接下来本文关键为大家介绍了对于Python词典查找数据的5个基本操作步骤,必须的小伙伴可以借鉴一下  序言  上篇文章写对于词典操作步骤的增删改,这篇文章关键解读如何查找词典数据信息。查找数据书写总共有二种,一类能够是key值搜索,另一种是根据函数的书写开展关联查询。  一、key...

    89542767 评论0 收藏0
  • js中的|与 &amp;&amp; 算符详解

    摘要:这个时候我就有点犯迷糊了,为什么逻辑运算符能这么用呢由于是出身,所以对这样用感觉很奇怪。 这篇文章主要介绍了js中的 || 与 && 运算符详解,需要的朋友可以参考下 一 js中逻辑运算符在开发中可以算是比较常见的运算符了,主要有三种:逻辑与&&、逻辑或||和逻辑非!。 当&&和|| 连接语句时,两边的语句会转化为布尔类型(Boolean),然后再进行运算,具体的运算规则如下: 两边条...

    baoxl 评论0 收藏0
  • js中的|与 &amp;&amp; 算符详解

    摘要:这个时候我就有点犯迷糊了,为什么逻辑运算符能这么用呢由于是出身,所以对这样用感觉很奇怪。 这篇文章主要介绍了js中的 || 与 && 运算符详解,需要的朋友可以参考下 一 js中逻辑运算符在开发中可以算是比较常见的运算符了,主要有三种:逻辑与&&、逻辑或||和逻辑非!。 当&&和|| 连接语句时,两边的语句会转化为布尔类型(Boolean),然后再进行运算,具体的运算规则如下: 两边条...

    jsyzchen 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<