[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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c++|引用

目录 一、引用概念 二、引用特性 三、常引用 &#xff08;具有常属性的引用变量&#xff09; 四、使用场景 一、引用概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;他和他引用的变量共用同…

Java动态代理JKD版本

1、ISale.java package com.atguigu; public interface ISale {void saleShaoBing();void saleJianBing();void saleYueBing();void saleManTou(); }2、WuDa.java package com.atguigu;//Target:目标类、目标对象 public class WuDa implements ISale{//target method:目标方法…

Polygon Miden VM架构总览

1. 计算类型 Programs程序有2种类型&#xff1a; 1&#xff09;Circuit电路&#xff1a;即&#xff0c;程序即电路。将程序转换为电路。2&#xff09;Virtual machine虚拟机&#xff1a;即&#xff0c;程序为电路的输入。【Miden VM属于此类型】 2. 何为ZK virtual machine…

用Markdown Nice写作

网址&#xff1a;https://www.mdnice.com/ 代码 表格 第二行用来对齐&#xff1a; -表示左对齐 :-:表示居中 -:表示右对齐 数学 上下标 分数 累加 幂 对数 根式 微积分 交集、并集 格式 标题 缩进 删除线 斜体 加粗 参考文献

【ArcGIS Pro二次开发】(77):ArcGIS Pro中图层的获取与解析

一、最简单的获取图层方式 通常情况下&#xff0c;如果要获取当前地图中的图层&#xff0c;可以用2种方法获取。 以下图为例&#xff1a; 一种是【map.Layers】属性获取&#xff0c;结果如下&#xff1a; 可以看出&#xff0c;这里只获取到了第一层级的图层&#xff0c;图层组…

目标检测 详解SSD原理,数据处理与复现

原理详解 前言 今天我们要读的这篇VGGNet&#xff08;《Very Deep Convolutional Networks For Large-Scale Image Recognition》&#xff09;&#xff0c;就是在AlexNet基础上对深度对网络性能的影响做了进一步的探索。它是ImageNet 2014年亚军&#xff0c;相比于AlexNet&am…

inBuilder低代码平台新特性推荐-第九期

各位知乎的友友们&#xff0c;大家好~ 今天来给大家带来的是inBuilder低代码平台特性推荐系列第九期——子表弹出新增&#xff01; 01 概述 子表弹出新增&#xff0c;是低代码平台提供的一种前端输入组件&#xff0c;在子表字段较多的场景中&#xff0c;有时为了方便…

代码随想录刷题】Day16 二叉树03

文章目录 1.【104】二叉树的最大深度&#xff08;优先掌握递归&#xff09;1.1 前言1.2 题目描述1.3 递归法java代码实现1.4 迭代法java代码实现1.5 相关练习题【559】N叉树的最大深度 2.【111】二叉树的最小深度&#xff08;优先掌握递归&#xff09;2.1 题目描述2.2 递归法ja…

智能高效的转运机器人,为物流行业注入新动力

在当今社会&#xff0c;随着科技的不断发展&#xff0c;机器人已经逐渐融入到我们的生活中。其中&#xff0c;转运机器人作为物流行业的新秀&#xff0c;正以其高效、智能的特点&#xff0c;引起了广泛的关注。 转运机器人&#xff0c;是指能够自主进行物品搬运和运输的机器人…

说一下类的生命周期

&#x1f47d;System.out.println(“&#x1f44b;&#x1f3fc;嗨&#xff0c;大家好&#xff0c;我是代码不会敲的小符&#xff0c;双非大四&#xff0c;Java实习中…”); &#x1f4da;System.out.println(“&#x1f388;如果文章中有错误的地方&#xff0c;恳请大家指正&a…

开始通过 Amazon SageMaker JumpStart 在亚马逊云科技上使用生成式 AI

目前&#xff0c;生成式 AI 正受到公众的广泛关注&#xff0c;人们围绕着许多人工智能技术展开讨论。很多客户一直在询问有关亚马逊云科技生成式 AI 解决方案的更多信息&#xff0c;本文将为您进行解答。 这篇文章通过一个真实的客户使用案例概述了生成式 AI&#xff0c;提供了…

京东数据分析软件(京东平台数据分析):2023年Q3扫地机器人行业消费报告

随着90后、00后逐渐成为消费主力军&#xff0c;他们对生活品质更加关注、健康意识进一步增强&#xff0c;再加上“懒人经济”的盛行&#xff0c;人们对扫地机器人的使用率和关注热情也不断增长。 根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;今年7月份-9月份&#xf…

Linux ps -ef|grep去除 grep --color=auto信息

linux 监控 进程判断是否启动可通过该指令实现 ps -ef|grep java指令结果为 # -v 参数有过滤作用 ps -ef|grep java |grep -v grep

CentOS 8最小安装,VM使用这个内存占用小很多

文章目录 一、安装包下载作者使用的安装包 二、安装过程截图三、最小化安装拥有的外部命令四、查看ip&#xff08;方便ssh连接&#xff09;五、yum源有问题参考文档 一、安装包下载 CentOS 网站&#xff1a; https://www.centos.org/CentOS 维基&#xff1a; https://wiki.cen…

HugeGraph安装与使用

1、HugeGraph-Server与HugeGraph-Hubble下载 HugeGraph官方地址&#xff1a;https://hugegraph.apache.org/ 环境为&#xff1a;linux 官网是有模块版本对应关系,尽量下载较新版本,hubble1.5.0之前是studio功能比较少。官网已经下架server,其他模块下载也比较慢。可以在网上找…

xss-labs靶场1-5关

文章目录 前言一、靶场需要知道的前置知识点1、什么是xss攻击&#xff1f;2、xss攻击分为几大类1、反射型xss2、存储型xss3、dom型xss 3、xss攻击形成的条件 二、xss-labs关卡1-51、关卡12、关卡23、关卡34、关卡45、关卡5 总结 前言 此文章只用于学习和反思巩固xss攻击知识&a…

4.Gin HTML 模板渲染

4.Gin HTML 模板渲染 Gin HTML 模板渲染 1. 全部模板放在一个目录里面的配置方法 创建用于渲染的模板html templates/index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> …

如何入驻抖音本地生活服务商,附上便捷流程!

抖音作为一款短视频社交媒体应用&#xff0c;已经成为全球范围内数以亿计的用户的首选。而在普及的同时&#xff0c;短视频领域也在不断拓展自身的业务领域&#xff0c;其中之一就是本地生活服务。继抖音本地生活服务之后支付宝、视频号也相继开展了本地生活服务&#xff0c;用…

如何在IAR软件中使用STLINK V2编译下载和调试stm8单片机

安装使用IAR后&#xff0c;如使用系统默认设置&#xff0c;往往很难正常实现用stlink v2来下载和调试stm8芯片&#xff0c;我的解决方法如下&#xff1a; 1、打开项目的options菜单&#xff1a; 2、在项目的选项菜单中选择ST-LINK作为调试工具&#xff1a; 3、选择额外的输出…

六、程序员指南:数据平面开发套件

PORT HOTPLUG FRAMEWORK 端口热插拔框架为DPDK应用程序提供在运行时附加和分离端口的能力。由于该框架依赖于PMD实现&#xff0c;PMD无法处理的端口超出了该框架的范围。此外&#xff0c;在从DPDK应用程序分离端口后&#xff0c;该框架不提供从系统中移除设备的方法。对于由物…