C++运算符的重载

重载的概念

重载(Overloading)不仅仅局限于运算符,在C++中函数也可以重载,只要函数名称相同但参数列表不同,就可以视为重载函数。这样,根据传入的不同参数类型或数量,编译器就能正确识别调用的是哪一个版本的函数。

运算符重载(Operator Overloading)

运算符重载(Operator Overloading)是一种机制,为运算符赋予针对用户自定义类型的特定含义。这意味着我们可以为类或结构体重新定义(重载)运算符的行为,使其能够用于特定类型的对象。这有助于提高代码的清晰度和一致性,使得用户自定义类型的行为看起来更像是内置类型。

运算符重载——复数举例

class Complex {
public:
    double r, i; // 实部和虚部
    // 构造函数和其他成员函数略...
    // 重载加法运算符 '+'
    Complex operator+(const Complex& other) {
        Complex result;
        result.r = this->r + other.r;
        result.i = this->i + other.i;
        return result;
    }
    // 重载输出运算符 '<<',便于输出复数到ostream(如cout)
    friend ostream& operator<<(ostream& os, const Complex& c) {
        os << c.r << "+" << c.i << "i";
        return os;
    }
};
int main() {
    Complex c1{1.0, 2.0};
    Complex c2{3.0, 4.0};
    // 使用重载的加法运算符
    Complex sum = c1 + c2;
    // 使用重载的输出运算符
    cout << "Sum: " << sum << endl;
    return 0;
}

为复数类重载了加法运算符+,使得两个复数对象可以相加,得到一个新的复数对象。同时,我们也重载了输出运算符<<使得复数对象可以像内置类型一样方便地输出到标准输出流(如控制台)。这样,当调用c1 + c2时,会执行我们定义的加法运算符函数,而不是C++内置的加法运算;同样,当我们使用cout << sum时,会调用我们自定义的输出运算符函数来打印复数。 

重载运算符的注意点

  1. 只能重载已存在的运算符: 你不能创建新的运算符,只能对C++语言中已经存在的运算符进行重载,如+, -, *, /, ==, !=, <, >, +=, [], ()等。

  2. 至少有一个操作数是用户自定义类型: 当重载二元运算符时(例如+-),至少有一个操作数必须是类或结构类型的对象。也就是说,你不能为内置类型(如intdouble)之间已有的运算符再提供新的含义。

  3. 运算符的语义: 重载后的运算符应保持原有的语义,除非这样做不符合类的设计目标。例如,如果重载+运算符用于两个复数对象相加,那么它应该遵循数学上的加法规则。

  4. 优先级和结合性不可改变: 重载运算符的优先级和结合性仍然是固定的,它们与对应的原始C++运算符保持一致。

  5. 成员函数与非成员函数: 二元运算符可以作为成员函数(有一个隐含的this参数)或非成员函数(接受两个显式的参数)。例如,作为成员函数的operator+只需一个参数,而非成员函数则需要两个。

  6. 特殊运算符: 有些运算符不能被重载,如., .*, ::, ?:, sizeof等。

  7. 操作数的数量和顺序: 重载运算符时,不能更改操作数的数量和顺序。例如,如果原先是二元运算符,重载后也必须是二元的。

  8. 返回类型: 根据运算符的具体语义,返回类型应合理选择,比如+运算符可能返回一个新创建的对象,而赋值运算符=通常返回左侧对象自身的引用以便支持链式赋值。

  9. 异常安全性: 在设计重载运算符时,特别是在处理资源管理类(如智能指针)时,应考虑异常安全性,确保即使在异常抛出的情况下也能正确释放资源。

  10. 短路逻辑: 对于逻辑运算符&&||,重载后将不再具有短路特性,即不论左侧表达式的值如何,右侧都会被执行。

  11. const成员函数: 如果重载的运算符不会修改类的状态,应声明为const成员函数,这样它才能应用于const对象。

  12. 友元函数: 有时需要将运算符重载为类的友元函数,以便访问类的私有和保护成员。

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

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

相关文章

搜好货API接口:快速获取商品列表的利器

搜好货商品列表API接口允许开发者根据关键字搜索并获取相关的商品列表数据。接口支持多种参数配置&#xff0c;可以根据需求灵活调整搜索条件和结果返回格式。 点击获取key和secret API接口请求说明 请求地址&#xff1a;https://api.souhaohuo.com/goods/search请求方法&…

Java——认识异常

目录 一.异常的概念与体系结构 1.异常的概念 1.1算术异常 1.2数组越界异常 1.3空指针异常 2.异常的体系结构 3.异常的分类 3.1编译时异常 3.2运行时异常 二.异常的处理 1.防御式编程 1.1LBYL 1.2EAFP&#xff08;核心&#xff09; 2.异常的抛出 3.异常的捕获 3…

主流Text2Image技术学习

DDPM原理 DDPM&#xff08;Denoising Diffusion Probabilistic Models&#xff09;是一种生成模型&#xff0c;它通过模拟数据的扩散过程来生成新的数据样本。 DDPM通过一个随时间增加噪声的扩散过程和一个逐步去除噪声的生成过程来模拟数据分布。其核心在于训练一个去噪声模…

Steam新人下载安装教程分享 迅游一键下载安装steam

Steam平台是Valve公司聘请的BitTorrent协议&#xff08;BT下载&#xff09;发明者Bram Cohen亲自开发设计。国内玩家对于Valve公司的游戏不会陌生&#xff0c;该公司发行的游戏有半条命系列、反恐精英系列、求生之路系列、传送门系列、军团要塞2、Dota2。Steam平台的客户端新增…

使用docker安装redis

使用docker安装redis ①拉取镜像 docker pull redis:6.2.6② 创建容器 docker run -d --name forum-redis --restartalways -p 6379:6379 redis:6.2.6 redis-server --requirepass "dong97"③链接测试 打开Redis Desktop Manager&#xff0c;输入host、port、pas…

开源版本管理系统的搭建一:SVN服务端安装

作者&#xff1a;私语茶馆 1.Windows搭建SVN版本管理系统 点评&#xff1a;SVN本身非常简洁易用&#xff0c;VisualSVN文档支撑非常好&#xff0c;客户端TortoiseSVN非常专业。5星好评。 1.1.SVN概要和组成 背景介绍 Svn是一个开源版本管理系统&#xff0c;由CollabNet公司…

Java Map集合(二)

1. HashMap原理 1.1 HashMap的容量 HashMap中使用数组作为存储元素的桶&#xff0c;对应的内部属性为table&#xff0c;如下图所示。HashMap的内部数组不是在创建HashMap对象时初始化&#xff0c;而是在首次存入元素时进行初始化&#xff0c;以减少对内存的占用。 从源码注释中…

【STM32+HAL】三轴按键PS2摇杆

一、准备工作&#xff1a; 有关CUBEMX的初始化配置&#xff0c;参见我的另一篇blog&#xff1a;【STM32HAL】CUBEMX初始化配置 有关定时器触发ADC模式配置&#xff0c;详见【STM32HAL】ADC采集波形实现 二、所用工具&#xff1a; 1、芯片&#xff1a; STM32F407VET6 2、CUBE…

小蓝本--因式分解(习题1)讲解

这几天要备战期中&#xff0c;下一期可能要等暑假了...... 小升初的压力真是紧扣于头啊&#xff0c;为了分到一个好班&#xff0c;拼了&#xff01; 对了&#xff0c;下一期可能在寒假更&#xff0c;见谅&#xff01; 1分解因式&#xff1a; 公因式&#xff1a; 答案&#xff…

发动机台架测试起动电源为发动机台架测试提供方便操作

发动机台架测试启动电源通常是指为发动机试验设备提供电力的装置&#xff0c;它可能包括交流电源、直流电源或专用的启动发电机。在进行发动机性能测试时&#xff0c;需要稳定的电力供应来驱动各种测试设备&#xff0c;如振动台、数据采集系统等。具体到电源类型常见的有市电、…

QT:label标签/进度条的使用

文章目录 设置不同格式的文本显示图片文本对齐/自动换行/缩进/边距LCDNumber倒计时 ProgressBar进度条 设置不同格式的文本 在文本格式中&#xff0c;存在富文本&#xff0c;makedown格式的文本&#xff0c;还有纯文本&#xff0c;下面就依据这三个进行举例 #include "w…

# 从浅入深 学习 SpringCloud 微服务架构(七)Hystrix(1)

从浅入深 学习 SpringCloud 微服务架构&#xff08;七&#xff09;Hystrix&#xff08;1&#xff09; 一、Hystrix&#xff1a;基于 RestTemplate 的熔断配置 1、Hystrix 介绍&#xff1a; 1&#xff09;Hystrix 是由 Netflix 开源的一个延迟和容错库&#xff0c; 用于隔离访…

nginx--配置文件

组成 主配置文件&#xff1a;nginx.conf 子配置文件&#xff1a;include conf.d/*.conf 协议相关的配置文件&#xff1a;fastcgi uwsgi scgi等 mime.types&#xff1a;⽀持的mime类型&#xff0c;MIME(Multipurpose Internet Mail Extensions)多用途互联⽹网邮件扩展类型&…

渲染 函数

DOM树 什么是渲染函数 在多数情况下&#xff0c;Vue推荐使用模板template来创建HTML。 然而在一些应用场景中&#xff0c;需要使用JavaScript创建HTML。 这时可以用渲染函数&#xff0c;它比模板更方便。 render函数的主要神秘地方就是Vue的h函数。 h()函数 h()函数是一个用于…

学习Rust的第26天:Rust中的cp

在本文中复刻了 cp 实用程序的功能&#xff0c;我想默认使其递归&#xff0c;因为每次我想复制时都输入 -R 文件夹都会觉得有点重复&#xff0c;本文代码将与前文代码保持相似&#xff0c;我们只会更改程序的核心功能和一些变量名称以匹配用例 Pseudo Code 伪代码 function cop…

C#实战—代码实现收发文件智能化

在信息化的今天&#xff0c;收发电子文档几乎是每个朋友都要经历的事情。比如班级学委和班长需要收发作业&#xff0c;企业管理者需要收发工作文件。但是&#xff01;&#xff01;&#xff01; 每到要交结果时&#xff0c;往往会发现总会有一些人没有即使交上&#xff0c;50个…

基于Springboot的校园食堂订餐系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园食堂订餐系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

区域文本提示的实时文本到图像生成;通过一致性自注意力机制的视频生成工具保持视频的一致性;专门为雪佛兰汽车设计的客服聊天机器人

✨ 1: StreamMultiDiffusion StreamMultiDiffusion是首个基于区域文本提示的实时文本到图像生成框架&#xff0c;实现了高速且互动的图像生成。 StreamMultiDiffusion 旨在结合加速推理技术和基于区域的文本提示控制&#xff0c;以克服之前解决方案中存在的速度慢和用户交互性…

从零开始学AI绘画,万字Stable Diffusion终极教程(一)

【第1期】SD入门 2022年8月&#xff0c;一款叫Stable Diffusion的AI绘画软件开源发布&#xff0c;从此开启了AIGC在图像上的爆火发展时期 率先学会SD的人&#xff0c;已经挖掘出了越来越多AI绘画有趣的玩法 从开始的AI美女、线稿上色、真人漫改、头像壁纸 到后来的AI创意字、AI…

望仙谷听谿涛

望仙谿涛 近来不知为何&#xff0c;染上喝咖啡的恶习&#xff0c;称为“恶”&#xff0c;是因为要花钱&#xff0c;而且非得是那种口感好的。 网络流行“人生无解&#xff0c;来杯拿铁”。 大抵是因为咖啡再苦&#xff0c;也比不过生活吧&#xff0c;至少咖啡可以加糖&#xff…
最新文章