C++ 入门08:运算符重载

往期回顾:

C++ 入门05:类和对象-CSDN博客

C++ 入门06:类的进阶(构造函数的重载与拷贝构造函数)-CSDN博客

C++ 入门07:静态成员和常量成员-CSDN博客


 一、前言

在前面的文章学习中,我们学习了类和对象的基础知识以及构造函数、拷贝构造函数、静态成员和常量成员。今天,我们将深入学习运算符重载。运算符重载是 C++ 的一大特色,它使得我们可以对类对象使用类似于基本数据类型的运算符,从而使代码更加简洁和易读。

二、运算符重载

2.1、 什么是运算符重载?

运算符重载是C++中一个强大且灵活的特性,它允许开发者为自定义类型(如类)重新定义或“重载”C++中已有的运算符。这种机制极大地增强了代码的可读性和易用性,使得针对自定义类型的操作能够以一种类似于内置数据类型(如int、float等)的方式来进行。

2.2、为什么要进行运算符重载?

直观性通过重载运算符,可以使类对象之间的操作看起来就像是对内置数据类型的操作一样,从而提高代码的可读性和可维护性。例如,如果定义了一个复数类,那么重载加法运算符+就可以让两个复数对象的相加看起来就像是对两个整数的相加一样直观。
一致性在C++中,内置数据类型的运算符行为是预定义的。通过为自定义类型重载这些运算符,可以确保自定义类型与内置类型在表达和操作上的一致性,从而简化编程模型。
封装性运算符重载提供了一种封装复杂操作的方式。通过将复杂的逻辑隐藏在简单的运算符背后,可以隐藏类的内部实现细节,只暴露必要的接口给使用者。

2.3、如何进行运算符重载?

运算符重载是通过在类中定义特殊的成员函数(称为运算符函数)来实现的。这些函数的名字由关键字operator后跟要重载的运算符符号组成。运算符函数可以是成员函数,也可以是友元函数,具体取决于运算符的操作是否需要访问类的私有或保护成员。

2.4、运算符重载的规则和限制

  1. 不可重载的运算符:并非所有C++运算符都可以被重载。例如,.(成员访问运算符)、.*(成员指针访问运算符)、::(作用域解析运算符)、sizeof(大小运算符)、typeid(类型识别运算符)以及几个与对象构造和析构相关的运算符(如newdelete)都不能被重载。

  2. 运算符的语义:虽然可以重载运算符,但应该保持运算符的原有语义,即该运算符在被重载后应该继续表达相似的操作或逻辑。这有助于避免混淆和误解。

  3. 参数数量和类型:除了赋值运算符=、下标运算符[]、函数调用运算符()和成员访问运算符->*之外,大多数运算符函数只能有一个(对于一元运算符)或两个(对于二元运算符)参数。这些参数的类型和数量是固定的,不能随意改变。

  4. 返回类型:运算符函数的返回类型也是根据被重载的运算符而定的。例如,算术运算符(如+-*/)通常返回操作数的类型或其某种形式的转换类型。

  5. 友元函数:有时,为了重载的运算符能够访问类的私有或保护成员,可能需要将运算符函数声明为类的友元函数。

通过运算符重载,C++提供了一种强大的机制来扩展其语言特性,使得自定义类型能够以一种更加直观和自然的方式与内置类型进行交互。

2.5、运算符重载的语法

运算符重载是通过在类中定义特殊的成员函数来实现的。语法格式如下:

返回类型 operator运算符(参数列表) {// 函数体
}

其中,operator 关键字后面跟着要重载的运算符。例如,要重载加法运算符 +,则函数名为 operator+

A、重载加法运算符(+)

我们先来看看如何重载加法运算符。假设有一个 Complex 类,用于表示复数。

示例:

#include <iostream>
using namespace std;class Complex {
public:double real;double imag;Complex(double r = 0, double i = 0) : real(r), imag(i) {}// 重载加法运算符Complex operator+(const Complex &c) const {return Complex(real + c.real, imag + c.imag);}void display() const {cout << "(" << real << ", " << imag << "i)" << endl;}
};int main() {Complex c1(3.0, 4.0);Complex c2(1.5, 2.5);Complex c3 = c1 + c2; // 使用重载的加法运算符c1.display();c2.display();c3.display();return 0;
}

在这个示例中,我们定义了一个 Complex 类,并重载了加法运算符。重载的 operator+ 函数接受一个 Complex 对象作为参数,并返回一个新的 Complex 对象,其实部和虚部分别为两个操作数的对应部分之和。

B、重载减法运算符(-)

类似于加法运算符,我们也可以重载减法运算符。

示例:

#include <iostream>
using namespace std;class Complex {
public:double real;double imag;Complex(double r = 0, double i = 0) : real(r), imag(i) {}// 重载加法运算符Complex operator+(const Complex &c) const {return Complex(real + c.real, imag + c.imag);}// 重载减法运算符Complex operator-(const Complex &c) const {return Complex(real - c.real, imag - c.imag);}void display() const {cout << "(" << real << ", " << imag << "i)" << endl;}
};int main() {Complex c1(3.0, 4.0);Complex c2(1.5, 2.5);Complex c3 = c1 + c2; // 使用重载的加法运算符Complex c4 = c1 - c2; // 使用重载的减法运算符c1.display();c2.display();c3.display();c4.display();return 0;
}

在这个示例中,我们在 Complex 类中重载了减法运算符 operator-,使得两个 Complex 对象可以相减。

2. 6、重载赋值运算符(=)

赋值运算符 = 用于将一个对象的值赋给另一个对象。默认情况下,C++ 提供了一个默认的赋值运算符,但在某些情况下,我们需要自定义赋值运算符。

A、重载赋值运算符的语法

语法格式如下:

ClassName &operator=(const ClassName &other) {// 函数体return *this;
}

示例:

#include <iostream>
using namespace std;class Complex {
public:double real;double imag;Complex(double r = 0, double i = 0) : real(r), imag(i) {}// 重载赋值运算符Complex &operator=(const Complex &c) {if (this == &c) // 防止自我赋值return *this;real = c.real;imag = c.imag;return *this;}void display() const {cout << "(" << real << ", " << imag << "i)" << endl;}
};int main() {Complex c1(3.0, 4.0);Complex c2;c2 = c1; // 使用重载的赋值运算符c1.display();c2.display();return 0;
}

在这个示例中,我们在 Complex 类中重载了赋值运算符 operator=,使得可以将一个 Complex 对象的值赋给另一个 Complex 对象。注意在赋值运算符中,我们需要检查是否是自我赋值,如果是,则直接返回当前对象。


以上就是 C++ 程序的运算符重载的基础知识点了。包括重载加法运算符、减法运算符和赋值运算符。运算符重载使得我们可以对类对象进行类似于基本数据类型的操作,从而使代码更加简洁和易读。

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

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

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

相关文章

jmeter-beanshell学习7-props获取全局变量和设置全局变量

继续写点不痛不痒的小东西。第一篇写了vars设置变量&#xff0c;但是vars只能作用在同一个线程组。跨线程组情况比较少&#xff0c;要是用到跨线程组&#xff0c;有个pros&#xff0c;用法和vars一样。 在setup线程组设置变量a&#xff0c;执行的时候&#xff0c;jmeter会先执行…

Windows 电脑查看 WiFi 密码的方法都有哪些?

从设置面板中查看 当你使用的是笔记本电脑并且连接 WiFi 之后可以在设置面板中查看 WiFi 密码&#xff0c;首先打开设置界面&#xff0c;然后点击网络和 Internet&#xff0c;找到 WiFi 之后点击进入&#xff0c;然后点击管理已知网络。 然后点击已经连接好的无线网络。 进入之…

国产化趋势下源代码数据防泄密的信创沙盒的方案分享

随着国产化的大力推进&#xff0c;越来越多的企事业单位在逐步替换Windows、Linux等操作系统的使用。那么什是国产化了&#xff1f;国产化是指在产品或服务中采用国内自主研发的技术和标注&#xff0c;替代过去依赖的他国的产品和服务&#xff0c;国产化又被称之为“信创”&…

215.Mit6.S081-实验三-page tables

在本实验室中&#xff0c;您将探索页表并对其进行修改&#xff0c;以简化将数据从用户空间复制到内核空间的函数。 一、实验准备 开始编码之前&#xff0c;请阅读xv6手册的第3章和相关文件&#xff1a; kernel/memlayout.h&#xff0c;它捕获了内存的布局。kernel/vm.c&…

macOS系统下载navicat安装包

链接: https://pan.baidu.com/s/1SqTIXNL-B8ZMJxIBu1DfIw?pwdc1z8 提取码: c1z8 安装后效果

虚幻引擎 快速的色度抠图 Chroma Key 算法

快就完了 ColorTolerance_PxRange为容差&#xff0c;这里是0-255的输入&#xff0c;也就是px单位&#xff0c;直接用0-1可以更快 Key为目标颜色

Kafka第四篇——生产数据总体概括,源码解析分区策略,数据收集器,Sender发送线程,key值

目录 流程图以及总体概述 拦截器 分区器以及分区计算策略 为啥进行分区计算&#xff1f; producer生产者怎么知道有哪些分区&#xff1f; 分区计算 如何自定义实现分区器&#xff1f; 想说的在图里啦&#xff01;宝宝&#xff01;&#x1f4a1; ​编辑 如果key值忘记传递了呢&a…

python+selenium-UI自动框架之[优化]元素查找和BasePage页面

痛点&#xff1a;在页面查找元素的时候会遇到找不到或者其他无法处理某个字段的情况&#xff0c;又或者想要在输出的log或者report里面显示这个字段名称&#xff0c;这时候加上字段名称就很重要&#xff01; [3]pythonselenium - UI自动框架之封装查找元素https://mp.csdn.net…

电脑的D盘E盘F盘突然消失了 电脑只剩下C盘了其他盘怎么恢复

现如今随着时代的发展&#xff0c;无纸化办公成为主流&#xff0c;这主要归功于电脑&#xff0c;能够通过电脑完成的工作绝不使用纸质文件&#xff0c;这不仅提高了工作效率&#xff0c;也让一些繁杂的工作变的更加简单。不过电脑毕竟是电子产品&#xff0c;不可避免的会出现一…

通信协议_Modbus协议简介

概念介绍 Modbus协议&#xff1a;一种串行通信协议&#xff0c;是Modicon公司&#xff08;现在的施耐德电气Schneider Electric&#xff09;于1979年为使用可编程逻辑控制器&#xff08;PLC&#xff09;通信而发表。Modbus已经成为工业领域通信协议的业界标准&#xff08;De f…

Navicat导入sql文件

文章目录 Navicat导入SQL文件&#xff0c;使用默认导入&#xff0c;不做任何修改报错尝试一修改运行时的选择 尝试二修改my.ini的配置文件 Navicat导入SQL文件&#xff0c;使用默认导入&#xff0c;不做任何修改报错 尝试一 修改运行时的选择 取消勾选 ‘每个运行中运行多重查…

一键掌握天气动态 - 基于Vue和高德API的实时天气查询

前言 本文将学习如何使用Vue.js快速搭建天气预报界面,了解如何调用高德地图API获取所需的天气数据,并掌握如何将两者有机结合,实现一个功能丰富、体验出色的天气预报应用 无论您是前端新手还是有一定经验,相信这篇教程都能为您带来收获。让我们一起开始这段精彩的Vue.js 高德…

Mac的系统数据怎么删除 cleanmymac会乱删东西吗 cleanmymac有用吗

作为一款专业级的苹果电脑清理软件&#xff0c;CleanMyMac可以精准识别系统垃圾&#xff0c;有效防止Mac系统数据被误删。软件可以深入系统底层&#xff0c;清理无用的系统数据&#xff0c;优化苹果电脑设置&#xff0c;提升Mac系统性能。有关Mac的系统数据可以删吗&#xff0c…

拥抱 AGI:PieDataCS 引领云原生数据计算系统新范式

自2023年后&#xff0c;人工智能技术进入了一个更为成熟和广泛应用的阶段&#xff0c;人工通用智能&#xff08;AGI&#xff09;这一概念也成为了科技界和产业界热议的焦点。本文将结合 AGI 时代背景&#xff0c;从架构设计到落地实践&#xff0c;详细介绍拓数派云原生数据计算…

HTAP 数据库在国有大行反洗钱场景的应用

导读 在金融领域&#xff0c;随着数字化服务的深入和监管要求的提高&#xff0c;反洗钱工作变得尤为关键。洗钱活动不仅威胁金融安全&#xff0c;也对社会秩序构成挑战。本文深入探讨了国产 HTAP 分布式数据库 TiDB 在某国有大行反洗钱系统中的应用实践。 依托 TiDB 构建的新…

springboot大学校园二手书交易APP-计算机毕业设计源码25753

摘 要 在数字化与移动互联网迅猛发展的今天&#xff0c;人们对于图书的需求与消费方式也在悄然改变。为了满足广大读者对图书的热爱与追求&#xff0c;我们倾力打造了一款基于Android平台的图书交易APP。这款APP不仅汇聚了海量的图书资源&#xff0c;提供了便捷的交易平台&…

usbserver工程师手记(三)手工开通 OTP功能

1、设定密钥&#xff0c;用户自行选择一个密钥&#xff0c;以下以密钥为 EAZAYOKNGETBOPC5 为例说明 2、usb server 配置otp 密钥&#xff0c;目前还没有UI 界面开通&#xff0c;后续版本会支持从管理界面开通 curl -X POST -H Content-Type: application/json -H Accept: app…

【深度学习入门篇 ②】Pytorch完成线性回归!

&#x1f34a;嗨&#xff0c;大家好&#xff0c;我是小森( &#xfe61;ˆoˆ&#xfe61; )&#xff01; 易编橙终身成长社群创始团队嘉宾&#xff0c;橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官、CSDN人工智能领域优质创作者 。 易编橙&#xff1a;一个帮助编程小…

数据结构复习计划之复杂度分析(时间、空间)

第二节&#xff1a;算法 时间复杂度和空间复杂度 算法(Algorithm)&#xff1a;是对特定问题求解方法(步骤)的一种描述&#xff0c;是指令的有限序列&#xff0c;其中每一条指令表示一个或多个操作。 算法可以有三种表示形式&#xff1a; 伪代码 自然语言 流程图 算法的五…

FFmpeg 实现从麦克风获取流并通过RTMP推流

使用FFmpeg库&#xff08;版本号为&#xff1a;4.4.2-0ubuntu0.22.04.1&#xff09;实现从麦克风获取流并通过RTMP推流。 RTMP服务器使用的是SRS&#xff0c;我这边是跑在Ubuntu上的&#xff0c;最好是关闭掉系统防火墙&#xff0c;不然连接服务器好像会出问题&#xff0c;拉流…