在类外定义的运算符重载函数

news2024/9/28 13:53:51

        对基本的数据类型,C++提供了许多预定义的运算符,如+,-,*,/,=等,他们可以用一种简洁的方式工作,例如 + 运算符:

int x, y, z;
x = 3;
y = 5;
z = x + y;

这是将两个整数相加的方法,非常简单。

        若有一个复数类Complex:

class Complex
{
public:
    double real, imag;
    Complex(double r = 0, double i = 0)
    {
        real = r;
        imag = i;
    }
};

        若要把类Complex的两个对象Com1和Com2加在一起,下面语句是不能实现的:

int main
{
    Complex Com1(1.1, 2.2), Com2(3.3, 4.4), total;
    total = Com1 + Com2; // error
    ...
    return 0;
}

        不能实现的原因是类Complex的类型不是基本的数据类型,而是用户自定义的数据类型。所以C++无法直接将两个Complex类的对象相加。

        为了表达上的方便,人们希望预定义的运算符可以在特定类的对象上以新的含义进行解释,希望能够实现 total = Com1 + Com2,这就需要通过运算符重载来解决。

        C++为运算符重载提供了一种方法,即在进行运算符重载时,必须定义一个运算符重载函数,如下表1.1所示。

表 1.1 运算符重载函数
函数功能
operator+加法
operator-减法
operator*乘法
operator/除法
......

        这样,编译器在遇到一个运算符并且判断运算符两边的数据类型,就可以执行用户自定义的函数了。

        因此,若要将上述类Complex的两个对象相加,需要定义一个运算符重载函数operator+(),例如:

Complex operator+(Complex Om1, Complex Om2)
{
    Complex temp;
    temp.real = Om1.real + Om2.real;
    temp.imag = Om1.imag + om2.imag;
    return temp;
}

        这样我们就能方便的使用语句:

total = Com1 + Com2;

        以下就是使用运算符函数 operator+() 将两个Complex类对象相加的完整程序。

#include <iostream>

using namespace std;

class Complex
{
public:
    double real;
    double imag;
    Complex(double r = 0, double i = 0)
    {
        real = r;
        imag = i;
    }
    friend Complex operator+(Complex Co1, Complex Co2)// 定义运算符+的重载函数
    {
        Complex temp;
        temp.real = Co1.real + Co2.real;
        temp.imag = Co1.imag + Co2.imag;
        return temp;
    }
};

int main()
{
    Complex Com1(1.1, 2.2), Com2(3.3, 4.4), total;
    total = Com1 + Com2;
    cout << "real = " << total.real << " "<< "imag = " << total.imag << endl;
    return 0;
}

        程序运行结果如下:

        C++语言对运算符重载制定了以下一些规则,如表1.2。

表1.2 运算符重载规则
1.C++中大部分运算符可以重载除了“.” ".*" "::" "sizeof" "?:" 。
2.C++语言只能对已有的运算符重载,不允许用户自定义新的运算符。
3.运算符重载一般与原有符号的意义是一致的。
4.重载不能改变运算符的操作对象的个数。
5.重载不能改变运算符原有的优先级。
6.重载不能改变运算符原有的结合特性。
7.运算符重载函数的参数至少应有一个是类的对象。
8.运算符重载函数可以是普通函数,类的成员函数,类的友元函数。
9.用于类的对象的运算符必须重载,但是赋值运算符“=”例外。

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

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

相关文章

急!现在转大模型还来得及吗?零基础入门到精通,收藏这一篇就够了

大模型的出现&#xff0c;让行内和行外大多数人都感到非常焦虑。 行外很多人想了解却感到无从下手&#xff0c;行内很多人苦于没有硬件条件无法尝试。想转大模型方向&#xff0c;相关的招聘虽然层出不穷&#xff0c;但一般都要求有大模型经验。而更多的人&#xff0c;则一直处…

指数级增长使Hugging Face上的人工智能模型达到100万个

本周四&#xff0c;人工智能托管平台Hugging Face的人工智能模型列表首次突破100 万个&#xff0c;这标志着快速扩张的机器学习领域的一个里程碑。 人工智能模型是一种计算机程序&#xff08;通常使用神经网络&#xff09;&#xff0c;通过数据训练来执行特定任务或进行预测。 …

【算法】字符串相关

【ps】本篇有 4 道 leetcode OJ。 一、算法简介 字符串是一种数据结构&#xff0c;大多与别的算法结合在一起出题&#xff0c;例如模拟、高精度算法、双指针、dp、回溯等&#xff0c;因此这个专题的题型本身是特别丰富的。本篇选取了较为典型的字符串题型&#xff0c;除了涵盖一…

双端之Nginx+Php结合PostgreSQL搭建Wordpress

第一台虚拟机:安装 Nginx 更新系统包列表: sudo apt update安装 Nginx及php扩展: sudo apt install nginx php-fpm php-pgsql php-mysqli -y启动 Nginx 服务: sudo systemctl start nginx检查 Nginx 是否正常运行: xdg-open http://localhost注意:终端命令打开网址 …

【射频通信电子线路第六讲】射频信号与调制包括调幅和部分调频的内容

一、调制&#xff08;Modulation&#xff09;与解调&#xff08;Demodulation&#xff09; 1、相关概念 调制是指使一个信号&#xff08;如光信号、高频电磁振荡等&#xff09;的某些参数&#xff08;振幅、频率和相位&#xff09;按照另一个欲传输的信号的特点变化的过程。 …

Linux基础(二):磁盘分区

1.磁盘在Linux中的文件名 SATA接口的磁盘在Linux中名字为/dev/sdx。/dev 几乎是所有外接设备存放的文件夹&#xff1a; 磁盘在Linux中的文件名是不确定的&#xff0c;比如拿一个U盘插到Linux主机&#xff0c;可能第一次名字为sda&#xff0c;拔插后名字为sdc&#xff0c;这取…

新160个crackme - 067-CarLitoZ.1

运行分析 需要破解Code PE分析 VB程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 使用VB Decompiler分析&#xff0c;发现注册模块需要满足var_18 var_ret_7var_18 abt.Label1.MousePointer 即输入框填入的信息var_ret_7 Mid(var_1C, 6, 1) Mid(var_20, 9, 1…

《Linux运维总结:使用 MongoDB工具备份和恢复mongodb 7.0.14分片集群(方案一)》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、备份说明 1、要使用mongodump备份分片集群,您必须 停止负载均衡器、 停止写入,避免备份的数据出现状态不一致问题。 2、从MongoDB7.0.2开始(也可以从6.0…

net core mvc 数据绑定 《1》

其它的绑定 跟net mvc 一样 》》MVC core 、framework 一样 1 模型绑定数组类型 2 模型绑定集合类型 3 模型绑定复杂的集合类型 4 模型绑定源 》》》》 模型绑定 使用输入数据的原生请求集合是可以工作的【request[],Querystring,request.from[]】&#xff0c; 但是从可读…

芝法酱学习笔记(0.3)——SpringBoot下使用mybatis做增删改查和报表

零、前言 书接上回&#xff0c;我们搭建了windows下的开发环境&#xff0c;并给出了一个hello world级别的多模块SpringBoot项目。 毕竟java后端开发&#xff0c;离不开数据库的操作&#xff0c;为方便后面内容的讲解&#xff0c;这里再做一期铺垫&#xff0c;core模块下新增一…

国际版多语言点赞抖音分享点赞任务平台源码

>>>系统简述&#xff1a; 本系统是一个国际化的点赞、分享任务平台的源代码&#xff0c;特别针对抖音这个短视频社交平台进行了定制。源码支持十二种不同的语言&#xff0c;旨在为用户提供一个全球化的服务环境&#xff0c;促进内容的传播和互动。首页可领取脸书tikt…

如何使用 DomCrawler 进行复杂的网页数据抓取?

在互联网时代&#xff0c;数据是宝贵的资源。无论是市场分析、客户洞察还是内容聚合&#xff0c;从网页中抓取数据都是一项关键技能。Symfony 的 DomCrawler 是一个强大的工具&#xff0c;可以帮助开发者从复杂的网页中提取所需的数据。本文将详细介绍如何使用 DomCrawler 进行…

学习Python的难点分析

一、语法灵活性带来的困惑 缩进规则 Python使用缩进来表示代码块&#xff0c;而不是像其他编程语言&#xff08;如C或Java&#xff09;使用大括号。这虽然使代码看起来简洁&#xff0c;但对于初学者来说可能会造成困扰。例如&#xff1a; if True:print("This is insid…

C语言开发基础新手快速入门及精通系列学习教程(系统性完整C语言学习笔记整理)

关注我&#xff0c;一起学编程 前言 作为一名拥有多年开发经验的码农&#xff0c;我的职业生涯涵盖了多种编程语言&#xff0c;包括 C 语言、C、C# 和 JavaScript。在这一过程中&#xff0c;我深刻地意识到扎实的基础对于编程学习的重要性&#xff0c;尤其是对于 C 语言…

React 启动时webpack版本冲突报错

报错信息&#xff1a; 解决办法&#xff1a; 找到全局webpack的安装路径并cmd 删除全局webpack 安装所需要的版本

这条挣钱的路,离我好遥远啊

近日&#xff0c;笔者在发表的《乱篇弹&#xff08;54&#xff09;让子弹飞》一文中写道&#xff1a;“ 当然&#xff0c;笔者在《博客中国-狼头长啸的作家专栏》耕耘期间&#xff0c;也赚了一些用以补贴自己养老的‘ 散碎银两’。那么笔者是否可以依照知乎网的‘申请开通权限’…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-28

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-28 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-28目录前言1. Cognitive phantoms in LLMs through the lens of latent variables摘要研究背景问题与挑战创新点算法模型实验效果…

Java项目实战II基于Java+Spring Boot+MySQL的大学城水电管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 随着大学城规模的不断扩大和学生数量的急剧增加&#xff0c;大学城内的水电管理面临着前所未有的挑战…

一个月涨粉15万!霸屏某书的“AI奶奶”怎么做?AI副业变现零基础入门教程

大家好&#xff0c;我是灵魂画师向阳 最近&#xff0c;大家可能在小红书刷到过不少“奶奶"账号。这些账号通常都打着人间清醒xxx的名号&#xff0c;比如人间清醒月亮奶奶 人间清醒柒奶奶 等。它们在小红书上的数据都不错&#xff0c;其中&#xff0c;”人间清醒柒奶奶“一…

InfluxDB数据库在Windows中的部署与运行

本文介绍在Windows电脑中&#xff0c;下载、安装、部署并运行InfluxDB数据库服务的方法。 InfluxDB是一个开源的时间序列数据库&#xff0c;专为处理时间序列数据而设计。它最初发布于2013年&#xff0c;目前已被广泛应用于监控、日志记录、物联网、实时分析等领域&#xff0c;…