3.【CPP入门】(深浅拷贝||运算符重载||赋值运算符重载)

一.浅拷贝和深拷贝

1.引入

从上篇博客拷贝构造我们知道拷贝构造要传引用而不能传值,否则会发生无穷递归的情况。

1.若未显示定义拷贝构造函数,系统会生成默认的拷贝构造函数。默认的拷贝构造按内存序完成拷贝,我们称之为浅拷贝(值拷贝)。注:对内置类型按照字节方式拷贝,而自定义类型调用其的拷贝构造函数。
2.浅拷贝就是新拷贝的对象和原对象指向同一块空间,新拷贝的对象的值的改变也会引发原对象的值的改变。
3.深拷贝实质是在内存里重新为新拷贝的对象开辟一块空间,不指向同一块空间。

2.问题

我们拷贝日期这样的类用浅拷贝是没问题的,年月日都是在栈上创建销毁由系统开空间的释放空间的,但是如果这样的类呢?


class String
{
public:String(const char* str = "jack"){_str = (char*)malloc(strlen(str) + 1);strcpy(_str, str);}~String(){cout << "~String()" << endl;free(_str);}
private:char* _str;
};
int main()
{String s1("hello");String s2(s1);
}

_str是我们malloc出来在堆上的空间需要我们自己调用析构free掉,s2拷贝构造s1,编译器自动生成的默认拷贝函数会使s2和s1指向同一块空间,先定义的对象先析构,s1先析构掉这块开好的空间,s2再次析构时这块空间已经被释放掉了,程序报错。

二.运算符重载

1.概念

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似

函数名字为:关键字operator后面接需要重载的运算符符号。
函数原型:返回值类型 operator操作符(参数列表)

不能通过连接其他符号来创建新的操作符:比如operator@
重载操作符必须有一个类类型参数
用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义
作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this
.* :: sizeof ?: . 注意以上5个运算符不能重载。这个经常在笔试选择题中出现。

例如:以下在.h中声明,再cpp中实现的>运算符

bool Date::operator>(const Date& d)const
{return (_year > d._year)|| ((_year == d._year) && (_month > d._month))|| (_year == d._year) && (_month == d._month) && (_day > d._day);
}

写一个>和==就足够了,剩下的代码复用就行.

2.赋值运算符重载

2.1注意:

赋值运算符主要注意以下几点

1.参数类型:const T&,传递引用可以提高传参效率
2.返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值
3.检测是否自己给自己赋值
4.返回*this :要符合连续赋值的含义

//d1=d3Date& operator=(const Date& d)//引用作返回值,不用调用拷贝构造存临时变量{_year = d._year;_month = d._month;_day = d._day;return *this;}
2.2 赋值运算符只能重载成类的成员函数不能重载成全局函数

原因:赋值运算符如果不显式实现,编译器会生成一个默认的。此时用户再在类外自己实现一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符重载冲突了,故赋值运算符重载只能是类的成员数。
用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。注意:内置类型成员变量是直接赋值的,而自定义类型成员变量需要调用对应类的赋值运算符重载完成赋值。

2.3涉及资源管理避免默认生成的拷贝构造

同上浅拷贝和深拷贝的问题

3. 前置++和后置++的运算符重载

Date& Date::operator++(int)
{Date ret(*this);*this += 1;return ret;
}
Date& Date::operator++()
{*this += 1;return *this;
}

前置++先加加后使用,后置++先使用再加加,为了区分C++规定:后置++重载时多增加一个int类型的参数,但调用函数时该参数不用传递,编译器自动传递。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/615841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中迭代器的应用

迭代器&#xff08;Iterator&#xff09;在Python中是一种用于迭代访问元素的对象&#xff0c;它提供了一种统一的访问集合元素的方式。迭代器通常与可迭代对象&#xff08;Iterable&#xff09;一起使用&#xff0c;如列表、元组、字典等。以下是迭代器在Python中的应用场景&a…

开机自启动app

问&#xff1a;在android系统的tv上&#xff0c;用遥控器可以控制光标位置&#xff0c;这是不是有一些监听事件实现的&#xff0c;具体原理是什么 答&#xff1a; 在 Android TV 上&#xff0c;使用遥控器来控制光标位置的功能是通过处理按键事件和焦点控制来实现的。 Andro…

「许战海矩阵战略洞察」从“老干妈”看全国辣椒酱企业的发展战略

引言&#xff1a;老干妈作为辣椒酱行业的领导品牌&#xff0c;虽然市场份额大&#xff0c;但增长缓慢。本文分析了老干妈的成功秘诀和增长挑战&#xff0c;提出了建立组合信任、强化渠道管控和打造第二招牌产品的战略建议。同时&#xff0c;给我国辣椒酱企业提供了佐餐酱和烹饪…

Android Studio安卓读写NFC Ntag标签源码

本示例使用的发卡器&#xff1a; https://item.taobao.com/item.htm?spma1z10.5-c-s.w4002-21818769070.11.3513789erHXVGx&id615391857885 <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout x…

边缘计算的舞台,挑战与机遇相伴

目录 前言 边缘计算保卫战&#xff1a;数据宝藏的隐藏与探索 稳如磐石&#xff1a;保障你的边缘计算宝藏安稳运行&#xff01; 打破时间的桎梏&#xff1a;为边缘计算注入超快速度与实时表演 边缘计算&#xff1a;应对多样性和异构性的酷炫策略大揭秘 边缘计算&#xff1a;释…

中间件:构建现代软件架构的桥梁

一、前言 在当今快速发展的科技领域中&#xff0c;软件系统的复杂性不断增加。为了应对这一挑战&#xff0c;中间件应运而生&#xff0c;成为连接和协调不同软件组件的不可或缺的桥梁。本文将深入探讨中间件的基本概念、作用以及一些常见的中间件类型。 二、中间件的定义 中间…

C#实现Excel合并单元格数据导入数据集

目录 功能需求 Excel与DataSet的映射关系 范例运行环境 Excel DCOM 配置 设计实现 组件库引入 ​方法设计 返回值 参数设计 打开数据源并计算Sheets 拆分合并的单元格 创建DataTable 将单元格数据写入DataTable 总结 功能需求 将Excel里的worksheet表格导入到Da…

02.阿里Java开发手册——日期时间

【强制】日期格式化时&#xff0c;传入 pattern 中表示年份统一使用小写的 y。 说明&#xff1a;日期格式化时&#xff0c;yyyy 表示当天所在的年&#xff0c;而大写的 YYYY 代表是 week in which year&#xff08;JDK7 之后引入的概念&#xff09;&#xff0c;意思是当天所在的…

2023年全国职业院校技能大赛软件测试赛题—单元测试卷④

任务二 单元测试 一、任务要求 题目1&#xff1a;根据下列流程图编写程序实现相应分析处理并显示结果。返回结果“ax&#xff1a;”&#xff08;x为2、3或4&#xff09;&#xff1b;其中变量x、y均须为整型。编写程序代码&#xff0c;使用JUnit框架编写测试类对编写的程序代码…

通义千问AI挑战赛赛后反思

个人理解&#xff1a; 初赛阶段主要聚焦在如何通过 SFT 提升基础模型的代码能力&#xff0c;需要选手基于最新开源的 Qwen 1.8 模型作为基础模型&#xff0c;上分的关键主要通过收集高质量的代码数据提升模型的在Python, JavaScript, Java, Go, C, Rust六种编程语言的代码生成…

Echarts封装动态加载组件,并且添加循环效果

基于 Echarts 框架的组件&#xff0c;用于实现数据滚动效果。在该组件中&#xff0c;我们首先引入了 Echarts 库&#xff0c;并定义了组件的名称和所需的 props 属性。在 mounted 钩子函数中&#xff0c;我们调用 initChart 方法来初始化图表&#xff0c;并使用 setInterval 定…

《SPSS统计学基础与实证研究应用精解》视频讲解:SPSS依托统计学处理数据的应用场景

《SPSS统计学基础与实证研究应用精解》1.4 视频讲解 视频为《SPSS统计学基础与实证研究应用精解》张甜 杨维忠著 清华大学出版社 一书的随书赠送视频讲解1.4节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。本书旨在手把手教会使…

肝了半个月的学习路线终于上线了,升职加薪,轻松拿捏!

大家好&#xff0c;我是冰河~~ 最近有不少小伙伴问我出去面试找一份好工作要学习哪些知识和技术&#xff0c;有没有什么好的学习路线&#xff0c;这不&#xff0c;我连夜肝了这份Java完整高清学习路线。 学习路线 完整路线 这份Java完整高清学习路线的总体路线图如下所示。…

微信小程序开发学习笔记《7》全局配置以及小程序窗口

微信小程序开发学习笔记《7》全局配置以及小程序窗口 博主正在学习微信小程序开发&#xff0c;希望记录自己学习过程同时与广大网友共同学习讨论。全局配置官方文档 一、全局配置文件及常用的配置项 小程序根目录下的app.json 文件是小程序的全局配置文件。 常用的配置项如…

Redis的实现三:c语言实现平衡二叉树,通过平衡二叉树实现排序集

概况&#xff1a;Redis中的排序集数据结构是相当复杂的独特而有用的东西。它不仅提供了顺序排序数据的能力&#xff0c;而且具有按排名查询有序数据的独特特性。 Redis中的排序集 &#xff08;Sorted Set&#xff09;是一种特殊的数据结构&#xff0c;它结合了集合&#xff0…

C //练习 4-14 定义宏swap(t, x, y)以交换t类型的两个参数。(使用程序块结构会对你有所帮助。)

C程序设计语言 &#xff08;第二版&#xff09; 练习 4-14 练习 4-14 定义宏swap(t, x, y)以交换t类型的两个参数。&#xff08;使用程序块结构会对你有所帮助。&#xff09; 注意&#xff1a;代码在win32控制台运行&#xff0c;在不同的IDE环境下&#xff0c;有部分可能需要…

YOLOv7-tiny,通过pycocotools包得到预测大中小尺寸目标的指标值

文章目录 参考链接步骤认识正确的instances_val2017.json文件格式 代码&#xff08;mogui_tococo.py&#xff0c;用于我自己的数据集&#xff09; 参考链接 需要先在环境中安装pycocotools pip install pycocotools魔鬼面具的代码&#xff1a;objectdetection-tricks/tricks_…

openssl3.2 - 官方demo学习 - server-conf.c

文章目录 openssl3.2 - 官方demo学习 - server-conf.c概述笔记END openssl3.2 - 官方demo学习 - server-conf.c 概述 建立TLS服务器, 参数从配置文件中来.通过SSL_CONF_CTX_set_flags()来决定读那些TLS参数 遍历配置文件, 通过SSL_CONF_cmd()来读取预期的配置项. 如果不是TLS…

第 379 场 LeetCode 周赛题解

A 对角线最长的矩形的面积 模拟 class Solution { public:int areaOfMaxDiagonal(vector<vector<int>> &dimensions) {int res 0, len2 0;for (auto &x: dimensions)if (x[0] * x[0] x[1] * x[1] > len2 || x[0] * x[0] x[1] * x[1] len2 &&am…