[C++ 从入门到精通] 12.重载运算符、赋值运算符重载、析构函数

  • 📢博客主页:https://loewen.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉
  • 📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨

文章预览:

      • 一. 重载运算符
      • 二. 赋值运算符重载
      • 三. 析构函数


一. 重载运算符

1、运算符

  • 算术运算符:+、-、*、/、%
  • 赋值运算符:=
  • 关系运算符:>、<、>=、<=、==、!=
  • 逻辑运算符:&&,||;等

2、重载运算符:就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型

🐾 特性:运算符重载本质上就是一个函数

  • 在函数体内实现想要的功能,当用到该运算符时,编译器会自动调用这个函数;
  • 有返回类型和参数列表;

也就是说,运算符重载是通过函数实现的,它本质上是函数重载。

💐 语法:函数的名字由关键字operator及其紧跟的运算符组成 ,比如:重载+运算符 ==>operator+ 重载=号运算 ==>operator=

🌸 其他

有一些运算符的重载系统会自动生成,比如赋值运算符=,而有些运算符的重载系统不会自动生成,需要我们手动定义,比如关系运算符==

比如定义类的两个对象:

class Time
{
public:Time();int Hour;int Minute;int Second;
};
int main()
{Time myTime;Time myTime2;if(myTime == myTime2);  //比较对象A和对象B,不可以,比较运算符“==”缺省的情况下,系统不会自动生成,//并且系统不知道你要在什么样的条件下,才能判断两个对象是否相等,//所以需要自己对比较运算符“==”来重新定义,用于两个对象的比较。myTime = myTime2;       //将对象B赋值给对象A,可以,赋值运算符“=”缺省的情况下, 系统会自动生成。return 0;
}    

那么如何重新定义比较运算符==,使其可以判断两个对象是否相等呢?

这里的重新定义即比较运算符重载,我们可以规定某些规则来判断两个对象是否相等,比如当它的两个成员变量Hour之间的值相等时,我们可以判断两个对象相等之类的。


二. 赋值运算符重载

前面我们有提到过,如果赋值运算符“=”缺省的情况下,系统会自动生成一个默认的赋值运算符重载(函数)实现对象的赋值,将对象myTime2的数据成员逐一拷贝到对象myTime中。

虽然默认的赋值运算符重载(函数)能够实现很多拷贝,但是有很多时候它是不行的,这时需要对赋值运算符进行重载(重新定义)。

✨ 格式:T & operator=(const T&)

  • 参数类型:const T&,传递引用可以提高传参效率;
    const修饰:防止赋值的时候,参数值被修改;
  • 返回*this返回自身对象的引用,即等号=左边对象(下文myTime6)的地址
class Time
{
public:Time();int Hour;int Minute;int Second;Time(const Time &tmptime,int a = 5);Time & operator=(const Time&);   //若禁止赋值运算符重载的时候,将其声明为private即可
};
Time::Time():Hour(11), Minute(58), Second(49)
{std::cout << "调用了Time::Time()构造区数" << std::endl;
}Time::Time(const Time &tmptime, int a)
{std::cout << "调用了Time::Time(Time &taptime, int a)拷贝构造区数" << std::endl;
}//赋值运算符重载
Time & Time::operator=(const Time& tmp)
{Hour = tmp.Hour;Minute = tmp.Minute;Second = tmp.Second;std::cout << "调用了Time & Time::operator=(const Time& tmp)赋值运算符重载" << std::endl;return *this; //返回自身对象的引用
}
int main()
{Time myTime;               //调用构造函数Time myTime5 = { myTime }; //调用拷贝构造函数Time myTime6;              //调用默认构造函数(不带参数)myTime6 = myTime5;         //这个是赋值运算符,即没调用构造函数,也没调用拷贝构造函数//但系统会调用一个赋值运算符重载return 0;
}

在这里插入图片描述

可以看到,在最后执行myTime6 = myTime5时,调用了我们自己定义的赋值运算符重载,目的是可以更精确的控制类Time的赋值操作。

其中,在执行myTime6 = myTime5时,会调用Time & Time::operator=(const Time& tmp)赋值运算符函数。即:将myTime5的地址赋值给参数tmp,在函数内部完成一系列赋值操作后,再将对象的引用返回给myTime6。从而完成myTime5myTime6的赋值操作。


三. 析构函数

🐶 定义:析构函数」是特殊的类成员函数,「析构函数」 与 「构造函数」的作用正好相反,「构造函数」是对象创建的时候自动调用的,而 「析构函数」就是对象在销毁的时候自动调用的的。

🐵 格式: ~类名()

🐭 特性:

  • 默认生成性:同于「构造函数」,如果不显式的定义「析构函数」,编译器会生成一个默认的函数体为空的「析构函数」;
  • 唯一性:不同于「构造函数」可以有多个重载函数(名同、参不同),「析构函数」只有一个,并且因为不接收任何参数,所以不能被重载;
class Time
{
public:Time();~Time();
};
Time::~Time()
{std::cout << "调用了Time::~Time()析构函数" << std::endl;
}
int main()
{Time myTime;              Time myTime1 = { myTime }; system("pause");return 0;
}

在这里插入图片描述

因为在main函数体内创建了两个局部类对象,所以在main函数结束时(return之前)会自动调用两次析构函数(若为全局对象,则会在程序运行结束时调用析构函数)。

🐷 new对象和delete对象(配对使用):

Time *ptime = new Time();    //new动态创建类对象,这时系统会调用类Time的构造函数delete ptime;                //delete手动释放内存,这时系统会调用类Time的析构函数

有的人可能会觉得,若Time *ptime = new Time()出现在某个函数中时,认为其是个局部指针,会在函数运行结束之后ptime的内存被自动释放掉。这种想法是错误的,记住只要出现new,一定要delete手动释放其创建的内存。

总结: 对于用new动态创建的对象,一定要在程序停止运行的某个时刻,手动delete释放掉其内存,否则就会造成内存泄漏。


态度"ABC"理论的三个维度,即情感(Affective)、行为(Behavioral)和认知(Cognitive)

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

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

相关文章

VulnHub DC-7

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

EtherCAT从站EEPROM分类附加信息详解:RXPDO(输入过程数据对象)

0 工具准备 1.EtherCAT从站EEPROM数据(本文使用DE3E-556步进电机驱动器)1 分类附加信息——RXPDO(输入过程数据对象) 1.1 分类附加信息规范 在EEPROM字64开始的区域存储的是分类附加信息,这里存储了包括设备信息、SM配置、FMMU配置在内的诸多信息。每个信息在一段连续的…

python实战—核心基础1(高考倒计时)lv1

目录 一、核心代码解释 二、代码 三、运行截图 一、核心代码解释 1、datetime模块 Python有一个名为datetime的模块&#xff0c;用于处理日期和时间。 datetime模块中定义的一个类是datetime类。 可以使用now()方法创建一个包含当前本地日期和时间的datetime对象。 impo…

Milvus Standalone安装

使用Docker Compose安装 Milvus standalone&#xff08;即单机版&#xff09;&#xff0c;进行一个快速milvus的体验。 前提条件&#xff1a; 1.系统可以使用centos 2.系统已经安装docker和docker-compose 3.milvus版本这里选择2.3.1 由于milvus依赖etcd和minio&#xff0c…

公司电脑文件透明加密、防泄密管理软件系统

天锐绿盾数据透明加密系统是一款采用驱动层透明加密技术实现电子文件安全加密的防护产品&#xff0c;可以对企业电子文件的存储、访问、传播和处理过程实施全方位保护。该系统遵循基于文件生命周期安全防护的思想&#xff0c;集成了密码学、访问控制和审计跟踪等技术手段&#…

【开源】基于Vue.js的计算机机房作业管理系统的设计和实现

项目编号&#xff1a; S 017 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S017&#xff0c;文末获取源码。} 项目编号&#xff1a;S017&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 登录注册模块2.2 课程管理模块2.3 课…

某app c++层3处魔改md5详解

hello everybody,本期是安卓逆向so层魔改md5教学,干货满满,可以细细品味,重点介绍的是so层魔改md5的处理. 常见的魔改md5有: 1:明文加密前处理 2:改初始化魔数 3:改k表中的值 4:改循环左移的次数 本期遇到的是124.且循环左移的次数是动态的,需要前面的加密结果处理生成 目录…

crmchat安装搭建教程文档 bug问题调试

一、安装PHP插件&#xff1a;fileinfo、redis、swoole4。 二、删除PHP对应版本中的 proc_open禁用函数。 一、设置网站运行目录public&#xff0c; 二、设置PHP版本选择纯静态。 三、可选项如有需求则开启SSL,配置SSL证书&#xff0c;开启强制https域名。 四、添加反向代理。 …

Docker发布简单springboot项目

Docker发布简单springboot项目 在IDEA工具中直接编写Dockerfile文件 FROM java:8COPY *.jar /app.jarCMD ["--server.prot 8080"]EXPOSE 8080ENTRYPOINT ["java", "-jar", "/app.jar"]将项目打包成对应的jar包&#xff0c;将Dockerf…

MySQL 的执行原理(三)

5.4. InnoDB 中的统计数据 我们前边唠叨查询成本的时候经常用到一些统计数据&#xff0c;比如通过 SHOW TABLE STATUS 可以看到关于表的统计数据&#xff0c;通过 SHOW INDEX 可以看到关于索引 的统计数据&#xff0c;那么这些统计数据是怎么来的呢&#xff1f;它们是以什么方…

Notepad++ 和正则表达式 只保留自己想要的内容

一、需求 如下文本&#xff0c;三段相同结构的数据&#xff0c;想要获取每段结构中‘重复的Ids ’后面的数字 2023-10-26 18:49:49 重复的Ids 26443,26575 要删除的Ids 4174,4199,4200,55502023-10-26 18:49:49 重复的Ids 26436,26443,26575 要删除的Ids 4166,4199,4200,5550…

特殊文件(XML文件)

一&#xff0c;XML文件概括 二&#xff0c;案例 <?xml version"1.0" encoding"UTF-8" ?> <!--注释&#xff1a;以上抬头声明必须写在第一不然报错--> <users><user id"1"><uame>张无忌</uame><性别&g…

STM32:OLED屏幕开发

一、OLED原理 所谓的屏幕就是由一个个小灯组成&#xff0c;每个小灯称之为一个像素。只要在屏幕上有选择地点亮一部分小灯&#xff0c;就可以显示我们想要的图案。所谓下分辨率就是屏幕上的小灯数量。常见单片机中常见的屏幕分辨率常见的就是128(列长)*64(行高)。如果每个小灯都…

【云栖 2023】张治国:MaxCompute 架构升级及开放性解读

云布道师 本文根据 2023 云栖大会演讲实录整理而成&#xff0c;演讲信息如下 演讲人&#xff1a;张治国|阿里云智能计算平台研究员、阿里云 MaxCompute 负责人 演讲主题&#xff1a;MaxCompute架构升级及开放性解读 活动&#xff1a;2023云栖大会 MaxCompute 发展经历了三个阶…

发币成功,记录一下~

N年前就听说了这样一种说法——“一个熟练的区块链工程师&#xff0c;10分钟就可以发出一个新的币” 以前仅仅是有这么一个认识&#xff0c;但当时并不特别关注这个领域。 最近系统性学习中&#xff0c;今天尝试发币成功啦&#xff0c;记录一下&#xff5e; 发在 Sepolia Tes…

kerberos-MS14-068(kerberos域用户提权)

点击星标&#xff0c;即时接收最新推文 微软官方在2014年11月18日发布了一个紧急补丁&#xff0c;Windows全版本服务器系统受到影响&#xff0c;包括Windows Server 2003&#xff0c;Windows Server 2008&#xff0c;Windows Server 2008 R2&#xff0c;Windows Server 2012和W…

【ROS】RViz2源码分析(三):核心类VisualizerApp

【ROS】郭老二博文之:ROS目录 1、简述 VisualizerApp包含了三个主要的功能: QApplication:程序中主要调用app_->processEvents()来处理刷新界面,处理闪屏VisualizationFrame:窗口类都在此;RosClientAbstractionIface包含rclcpp::Node:代表ROS节点2、VisualizationF…

LeetCode热题100——二分查找

二分查找 1. 搜索插入位置2. 搜素二维矩阵3. 在排序数组中查找第一个和最后一个元素位置 1. 搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 // 题…

【电路笔记】-星三角变换(Star-Delta Transformation)

星三角变换&#xff08;Star-Delta Transformation&#xff09; 文章目录 星三角变换&#xff08;Star-Delta Transformation&#xff09;1、概述1.1 单相配置1.2 多相配置 2、三相连接2.1 Y配置2.2 Δ配置 3、Y-Δ 和 Δ-Y 变换3.1 Y-Δ变换3.2 Δ-Y变换3.3 应用 4、总结 本文…

蓝桥杯每日一题2023.11.20

题目描述 “蓝桥杯”练习系统 (lanqiao.cn) 题目分析 方法一&#xff1a;暴力枚举&#xff0c;如果说数字不在正确的位置上也就意味着这个数必须要改变&#xff0c;进行改变记录即可 #include<bits/stdc.h> using namespace std; const int N 2e5 10; int n, a[N], …