摘要:先说结论不加,形参是一个对象,这会形成一个临时对象,会调用拷贝构造函数发生浅拷贝问题。拷贝构造函数调用啦看一下运行结果没有任何问题
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
摘要:的数据类型,共有六种。通常,数值字符串布尔值这三种类型,合称为原始类型的值,即它们是最基本的数据类型,不能再细分了。运算符返回一个布尔值,表示某个对象是否为指定的构造函数的实例。 以下内容摘自阮一峰-JavaScript-标准参考教程 数据类型 JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型,共有六种。(ES6 又新增了第七种 Symbo...
Python词典是另一个可变性器皿实体模型,并可存放随意种类目标,如字符串数组、数据信息、数组等其它器皿实体模型,接下来本文关键为大家介绍了对于Python词典查找数据的5个基本操作步骤,必须的小伙伴可以借鉴一下 序言 上篇文章写对于词典操作步骤的增删改,这篇文章关键解读如何查找词典数据信息。查找数据书写总共有二种,一类能够是key值搜索,另一种是根据函数的书写开展关联查询。 一、key...
摘要:这个时候我就有点犯迷糊了,为什么逻辑运算符能这么用呢由于是出身,所以对这样用感觉很奇怪。 这篇文章主要介绍了js中的 || 与 && 运算符详解,需要的朋友可以参考下 一 js中逻辑运算符在开发中可以算是比较常见的运算符了,主要有三种:逻辑与&&、逻辑或||和逻辑非!。 当&&和|| 连接语句时,两边的语句会转化为布尔类型(Boolean),然后再进行运算,具体的运算规则如下: 两边条...
摘要:这个时候我就有点犯迷糊了,为什么逻辑运算符能这么用呢由于是出身,所以对这样用感觉很奇怪。 这篇文章主要介绍了js中的 || 与 && 运算符详解,需要的朋友可以参考下 一 js中逻辑运算符在开发中可以算是比较常见的运算符了,主要有三种:逻辑与&&、逻辑或||和逻辑非!。 当&&和|| 连接语句时,两边的语句会转化为布尔类型(Boolean),然后再进行运算,具体的运算规则如下: 两边条...
阅读 2256·2023-04-26 00:46
阅读 562·2023-04-25 21:36
阅读 687·2021-11-24 10:19
阅读 2232·2021-11-23 09:51
阅读 980·2021-10-21 09:39
阅读 775·2021-09-22 10:02
阅读 1635·2021-09-03 10:29
阅读 2601·2019-08-30 15:53