当前位置: 首页 > news >正文

运算符重载

多态性

多态性从实现角度可以分为两类:静态多态性和动态多态性

静态多态性主要应用于函数重载和运算符重载

动态多态性主要应用于虚函数

运算符重载就是定义函数

运算符重载为成员函数
运算符重载为友元函数

【引例】定义一个复数类,实现复数的加法功能。

方法一:定义一个复数类的ADD()成员函数
错误一:把ADD()当作全局函数来用了,他是类的成员函数,要通过对象打点调用


#include <iostream>using namespace std;class Complex{public:Complex(int,int);Complex();void show();Complex Add(const Complex&,const Complex &); private:int real,image;
};Complex::Complex(){}Complex::Complex(int real,int image):real(real),image(image){}void Complex::show(){//输出该复数//先考虑虚部 if(image>0){if(image==1)cout<<real<<"+"<<"i"<<endl;elsecout<<real<<"+"<<image<<"i"<<endl;}else if(image<0){if(image == -1)cout<<real<<"-"<<"i"<<endl;cout<<real<<image<<"i"<<endl; }elsecout<<real<<endl;} Complex Complex::Add(const Complex & c1,const Complex & c2){Complex res;res.real=c1.real+c2.real;res.image=c1.image+c2.image;return res; }int main(){Complex c1(1,-1),c2(2,3);Complex c3=Add(c1,c2); c1.show();c2.show();c3.show();return 0;
} 

改正后


#include <iostream>using namespace std;class Complex{public:Complex(int,int);Complex();void show();Complex Add(const Complex &); private:int real,image;
};Complex::Complex(){}Complex::Complex(int real,int image):real(real),image(image){}void Complex::show(){//输出该复数//先考虑虚部 if(image>0){if(image==1)cout<<real<<"+"<<"i"<<endl;elsecout<<real<<"+"<<image<<"i"<<endl;}else if(image<0){if(image == -1)cout<<real<<"-"<<"i"<<endl;else cout<<real<<image<<"i"<<endl; }elsecout<<real<<endl;} Complex Complex::Add(const Complex & c2){Complex temp;temp.real = this->real+c2.real;temp.image= this->image+c2.image;return temp; }int main(){Complex c1(1,-1),c2(2,3);Complex c3=c1.Add(c2);c1.show();c2.show();c3.show();return 0;
} 

方法二:重载为友元函数

重载运算符的规则

返回类型 operator @ (参数表)
{
重载函数体
}

//重载为友元函数#include <iostream>using namespace std;class Complex{public:Complex(int,int);Complex();void show();friend Complex operator+(const Complex&,const Complex &);private:int real,image;
};Complex::Complex(){}Complex::Complex(int real,int image):real(real),image(image){}void Complex::show(){//输出该复数//先考虑虚部 if(image>0){if(image==1)cout<<real<<"+"<<"i"<<endl;elsecout<<real<<"+"<<image<<"i"<<endl;}else if(image<0){if(image == -1)cout<<real<<"-"<<"i"<<endl;else cout<<real<<image<<"i"<<endl; }elsecout<<real<<endl;} Complex operator+(const Complex & c1,const Complex &c2){Complex temp;temp.real=c1.real+c2.real;temp.image=c1.image+c2.image;return temp;} int main(){Complex c1(1,-1),c2(2,3);Complex c3=c1+c2;   //隐式调用c3=operator+(c1,c2);  //显式调用    c1.show();c2.show();c3.show();return 0;
} 

临时插入一道题,判断两个复数是否相等

#include <iostream>using namespace std;class Complex{public:Complex(int,int);Complex();void show();friend bool operator == (const Complex & ,const Complex & );private:int real,image;
};Complex::Complex(){}Complex::Complex(int real,int image):real(real),image(image){}void Complex::show(){//输出该复数//先考虑虚部 if(image>0){if(image==1)cout<<real<<"+"<<"i"<<endl;elsecout<<real<<"+"<<image<<"i"<<endl;}else if(image<0){if(image == -1)cout<<real<<"-"<<"i"<<endl;else cout<<real<<image<<"i"<<endl; }elsecout<<real<<endl;} bool operator == (const Complex & c1,const Complex & c2 ){if(c1.real==c2.real&&c1.image==c2.image)return true;return false; }int main(){Complex c1(1,-1),c2(2,3);if(c1 == c2 )cout<<"c1和c2相等"<<endl;elsecout<<"c1和c2不相等"<<endl;	return 0;
} 

小练习

img

方法三:重载为成员函数

img

#include <iostream>using namespace std;class Complex{public:Complex(int,int);Complex();void show();bool  operator == ( const Complex &  );Complex operator + (const Complex & );private:int real,image;
};Complex::Complex(){}Complex::Complex(int real,int image):real(real),image(image){}void Complex::show(){//输出该复数//先考虑虚部 if(image>0){if(image==1)cout<<real<<"+"<<"i"<<endl;elsecout<<real<<"+"<<image<<"i"<<endl;}else if(image<0){if(image == -1)cout<<real<<"-"<<"i"<<endl;else cout<<real<<image<<"i"<<endl; }elsecout<<real<<endl;} 
bool Complex::operator == ( const Complex & c2 ){// 直接比较:this是当前对象(c1),c2是传入对象return (real == c2.real) && (image == c2.image);
}Complex Complex::operator + (const Complex & c2){Complex temp;temp.real=this->real+c2.real;temp.image=this->image+c2.image;return temp;}int main(){Complex c1(1,-1),c2(1,-1);if(c1.operator ==(c2))cout<<"c1和c2相等"<<endl;elsecout<<"c1和c2不相等"<<endl;	Complex c3 = c1.operator +(c2);c3.show();return 0;
} 

几种常用运算符的重载

img

http://www.jsqmd.com/news/665201/

相关文章:

  • html标签怎样表示强调_em和i标签语义差异说明【操作】
  • 用Python复现2024年新算法鹦鹉优化器(Parrot Optimizer):从论文公式到完整代码实现
  • 别再只会用ab了!Kali Linux下实战CC攻击与防护,手把手教你搭建自己的压力测试环境
  • 番茄小说下载器终极指南:免费开源工具帮你实现离线阅读自由
  • Sunshine游戏串流故障排除终极指南:从基础配置到高级优化的完整解决方案
  • TrollInstallerX终极指南:3分钟在iOS 14-16.6.1上安装TrollStore的完整教程
  • FRCRN模型训练数据准备与增强教程:从零构建数据集
  • 4月19日成都地区正大产焊管(Q235B;内径DN15-200mm)现货报价 - 四川盛世钢联营销中心
  • BilibiliCacheVideoMerge:安卓B站缓存视频合并完整解决方案
  • 小红书无水印下载神器:XHS-Downloader 完整使用指南与技巧
  • WorkshopDL:三步解锁Steam创意工坊模组,无需重复购买游戏
  • 【CrewAI系列1】测试人员如何不被淘汰?我用 CrewAI 搭建了 5 人 AI 团队.md
  • 抖音无水印下载器终极指南:免费快速保存你喜欢的视频
  • Chord视频分析工具在安防监控场景的应用:快速定位视频中的目标与时间
  • 终极指南:Fiji图像分析工具快速入门与高效使用秘籍 [特殊字符]
  • 锐捷AP520/720/3320远程管理避坑指南:从Telnet到SSH,再到DHCP自动分配,一次搞定
  • 探讨有实力的高效RTO焚烧炉厂家,个性化定制优势在哪 - mypinpai
  • QQ音乐加密格式终极解决方案:qmc-decoder让你轻松搞定音频转换
  • 老Mac焕新魔法:OpenCore Legacy Patcher解锁macOS新生的终极秘籍
  • 解密OpenCore Legacy Patcher:让老Mac重获新生的终极实战指南
  • Bilibili-Evolved终极指南:简单三步打造你的专属B站体验
  • 抖音直播弹幕数据抓取实战:逆向工程与实时监控的深度解析
  • 探寻肖诚数码口碑,其公益活动参与度高不高,实力究竟怎样 - myqiye
  • 飞书文档批量导出工具技术深度解析与架构设计
  • MetaboAnalystR 4.0:从原始LC-MS数据到生物学洞察的完整R包指南
  • WorkshopDL终极指南:免费获取Steam创意工坊模组的完整教程
  • 开源NCM解密工具:三步解锁网易云音乐格式限制
  • 避坑指南:在Ubuntu 18.04上搞定RK3568的RKNN环境(附Python 3.6.x和Numpy 1.16.6配置)
  • SVG Path Editor:3分钟掌握专业级矢量图形编辑的终极指南
  • Quicker专业版值不值得买?我用了半年后的真实体验与避坑指南