C++多态性——(5)运算符重载(第一节)

归纳编程学习的感悟,
记录奋斗路上的点滴,
希望能帮到一样刻苦的你!
如有不足欢迎指正!
共同学习交流!
🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝
晚上想想千条路,早上醒来走原路!——马云

一起加油!

        基本的数据类型可以用C++语法规定的运算符进行运算,但自定义的数据类型不能直接使用。用户有时会自定义一些数据类型,希望也可以很方便地使用这些运算符。一个复数z可以表示为z=x+yi,x、y均为实数,分别称为的实部和虚部,若两个复数z1=x1+y1i,z2=x1+y2i,则两个复数的加法、减法计算公式分别如下:

z1+z2 =x1+x2 +(y1+y2)i;
z1-z2=x1-x2 +(y1-y2)i;

         为了完成复数的加减法,在下例中定义了add(),sub()两个成员函数。

例:利用成员函数完成复数的加、减法运算。

分析:

        本例中add(),sub()函数为类Complex 的成员函数,由于做加法运算和减法运算都需要两个操作数,成员函数必须由一个 Complex类对象来调用调用add(),sub()的对象就是第一个左操作数。因此,这两个函数中需要传入的形参是右操作数,即第二个操作数。因此两个函数的形参只有一个,类型为 Complex 类的对象。复数相加、相减后,返回的也是一个复数,所以返回值也为Complex类型。

#include<iostream>
using namespace std;
class Complex{protected:double real,image;public:Complex(double px=0,double py=0){real=px;image=py;}Complex add(Complex c);Complex sub(Complex c);void print();
}; 
Complex Complex::add(Complex c)
{return Complex(real+c.real,image+c.image);
}
Complex Complex::sub(Complex c)
{return Complex(real-c.real,image-c.image);
}
void Complex::print()
{if(image<0.0){cout<<"("<<real<<image<<"i)"<<endl;}else{cout<<"("<<real<<"-"<<image<<"i)"<<endl;}
}
int main()
{Complex a(1.8,-2.4),b(4.3,4.7);Complex c=a.add(b);Complex d=a.sub(b);c.print();d.print();return 0;
}

        通过一定的处理后,C++默认的运算符也可以作用在自定义的数据类型Complex 上,使用系统内置的运算符完成自定义数据类型对象的运算可以使程序具有更好的可读性,书写也更加方便。

        当然,我们不能直接把语句“Complex c =a.add(b)”改写为:“Complex c=a+b”,否则编译后出现错误,因为C++中的运算符默认只能作用于基本的数据类型,要想使这些运算符作用于用户自己定义的数据类型,我们必须定义当运算符作用于某个类对象时,具体做什么操作,这就是运算符重载。
        C++中通过运算符重载机制可以使得系统原有的运算符具有多重含义,当它作用在用户自定义的数据类型上时,就按运算符重载时定义的运算规则进行运算。
        运算符重载的实质就是函数重载,在实现的过程中,首先把相应的表达式转换成对运算符重
载函数的调用,将操作数转化为运算符重载函数的实参;然后根据参数匹配的原则确定需要调用的运算符重载函数,这个过程在编译过程中采用静态联编的方式完成。运算符重载的一般语法形式为: 

返回值类型 operator 运算符(形参表)

{
              函数体

例:利用运算符重载完成复数的加减法运算。

分析:

        运算符重载的实质是函数重载,重载+、-运算,首先要定义两个函数operator+和operator-分析后我们发现,这两个函数与上例中的add和sub形式几乎是完全一致的。 

#include<iostream>
using namespace std;
class Complex{protected:double real,image;public:Complex(double px=0,double py=0){real=px;image=py;}Complex operator+(Complex c);Complex operator-(Complex c);void print();
}; 
Complex Complex::operator+(Complex c)
{return Complex(real+c.real,image+c.image);
}
Complex Complex::operator-(Complex c)
{return Complex(real-c.real,image-c.image);
}
void Complex::print()
{if(image<0.0){cout<<"("<<real<<image<<"i)"<<endl;}else{cout<<"("<<real<<"-"<<image<<"i)"<<endl;}
}
int main()
{Complex a(1.8,-2.4),b(4.3,4.7);Complex c=a+b;Complex d=a-b;c.print();d.print();return 0;
}

         以上就是我对C++多态性——(5)运算符重载(第一节)的理解,希望本篇文章对你有所帮助,也希望可以支持支持博主,后续博主也会定期更新学习记录,记录学习过程中的点点滴滴。如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对C++多态性的理解,请持续关注我哦!!! 

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

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

相关文章

Linux 进程(十) 进程替换

用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec*函数以执行另一个程序。当进程调用一种exec*函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec*并不创建新进程,所以调用exec*前…

中国诗歌史上的九座高峰

中国是诗的国度&#xff0c;诗歌在中国的影响远远大于其他文学艺术的影响力。自古以来&#xff0c;诗在我们的精神世界里占据着重要的位置&#xff0c;而且几乎人人都会吟诵古诗。 作为中国古诗的爱好者&#xff0c;认为许多的排名有局限性&#xff0c;只是从个人的爱好出发。…

Python新年烟花代码

Pygame 绘制烟花的基本原理 1&#xff0c;发射阶段&#xff1a;在这一阶段烟花的形状是线性向上&#xff0c;通过设定一组大小不同、颜色不同的点来模拟“向上发射” 的运动运动&#xff0c;运动过程中 5个点被赋予不同大小的加速度&#xff0c;随着时间推移&#xff0c;后面的…

JDBC数据库访问——数据库操作

与指定的数据库建立连接后&#xff0c;就可以使用JDBC提供的API对数据库进行操作&#xff0c;包括查询、新增、更新、删除等。 1.查询操作 和数据库建立连接后&#xff0c;对数据库表进行查询操作的步骤如下&#xff1a; ①创建statement对象 由已创建的Connection对象con调…

js逆向第8例:猿人学第1题-js 混淆-源码乱码

题目1:抓取所有(5页)机票的价格,并计算所有机票价格的平均值,填入答案。 老规矩打开控制台调试,出现debugger 过掉这个很简单了,右键点击“一律不在此处暂停” 这样就可以查看具体的网络请求如下: m是加密值,熟悉的大佬能发现这串加密字符非常像md5,|后面的就是时…

抓包工具:fiddler和wireshark对比

了解过网络安全技术的人都知道一个名词“抓包”。那对于局外人&#xff0c;一定会问什么是抓包&#xff1f;考虑到&#xff0c;大家的技术水平不一&#xff0c;我尽可能用非专业的口吻简单的说一下。 抓包就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作&a…

【Leetcode】2487. 从链表中移除节点

文章目录 题目思路代码 题目 2487. 从链表中移除节点 思路 1、递归移除节点&#xff1a; 如果头节点为空&#xff0c;直接返回空。递归调用函数处理下一个节点 head->next。在递归返回后&#xff0c;判断当前节点的值是否小于之前记录的最大值 maxVal。如果小于 maxVal…

力扣1944.队列中可以看到的人数--单调栈

思路&#xff1a; 由题知一个人能 看到 他右边另一个人的条件是这两人之间的所有人都比他们两人 矮 &#xff0c;也就是说&#xff0c;在自己右边第一个比自己高的人后面的人就肯定看不到了那么只需要找到右边第一个比自己高的人与自己之间的所有满足要求的人就行了&#xff0…

【Python可视化实战】钻石数据可视化

一、项目引言 1.背景和目标 钻石作为一种珍贵的宝石&#xff0c;其价格受到多种因素的影响。为了深入了解钻石价格的决定因素&#xff0c;我们收集了大量关于钻石的数据&#xff0c;并希望通过数据可视化来揭示钻石特征与价格之间的关系。 2.内容 收集钻石的各项特征数据&a…

QT5.14 实现ModbusTCP客户端 Demo

本文在QT5.14平台&#xff0c;基于QModbusClientTcp类&#xff0c;实现了客户端对单个寄存器的读写&#xff0c;用ModbusSlave做服务器做测试。 1.界面 (1)更改读按钮的名称为bt_Read (2)更改写按钮的名称为bt_Write 2.修改pro文件的第三行 greaterThan(QT_MAJOR_VERSION, 4)…

UE5 C++(十一)— 碰撞检测

文章目录 代理绑定BeginOverlap和EndOverlapHit事件的代理绑定碰撞设置 代理绑定BeginOverlap和EndOverlap 首先&#xff0c;创建自定义ActorC类 MyCustomActor 添加碰撞组件 #include "Components/BoxComponent.h"public:UPROPERTY(VisibleAnywhere, BlueprintRea…

vmware安装centos 7.6 操作系统

vmware安装centos 7.6 操作系统 1、下载centos 7.6 操作系统镜像文件2、安装centos 7.6操作系统3、配置centos 7.6 操作系统3.1、配置静态IP地址 和 dns3.2、查看磁盘分区3.3、查看系统版本 1、下载centos 7.6 操作系统镜像文件 这里选择 2018年10月发布的 7.6 版本 官方下载链…