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

类和对象(中)——运算符重载

引入

语言在语法上可以直接用指令实现运算符对 内置类型 的操作

C++中加入了类类型,那如何使用以前的运算符(如+ - * / 等),对类类型进行操作呢?

由此引入运算符重载:

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数(本质),也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。

函数名为:关键字operator后面接需要重载的运算符符号。
函数原型:返回值类型 operator操作符(参数列表)

全局函数形式

class Date
{
public:
Date(int year = 1, int month = 1,int day = 1)
{
_year = year;
_month = month;
_day = day;
}

//暂时注释private

//private:
int _year;
int _month;
int _day;
};

booloperator>(Date& d1, Date& d2) //作为全局函数,参数要保证完整
{

if (d1._year > d2._year)
return true;
else if (d1._year == d2._year)
{
if (d1._month > d2._month)
return true;
else if (d1._month == d2._month)
return d1._day > d2._day;
}
else
return false;
}

int main()
{
Date d1(2024,4,1);

Date d2(2024,4,2);

//两种调用方法本质相同,一般采用转换调用,可读性更强

//调用时会检查 > 是否已经重载(函数名operator> 和 参数列表),若未匹配到相应的重载函数,则报错

cout<<operator>(d1, d2)<<endl;//显式调用
cout << (d1 > d2) << endl;//转换调用,编译器会转换成operator>(d1, d2)
return 0;
}

注意事项

1.不能通过连接其他符号来创建新的操作符:比如operator@(@不是C++内置操作符)
2. 重载操作符至少有一个类类型参数
3. 重载运算符时,其含义在实践应用上一般不改变,例如:内置整型+,不改变其相加含义
4.类成员函数形式实现重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this
5..* :: sizeof ?: .注意以上5个运算符不能重载

补充.*操作符

class OB { public: void func() {} }; typedef void(OB::* PtrFunc)(); // 成员函数指针类型 //OB::* PtrFunc:表示这是一个指向 OB 类成员函数的指针类型 //void():表示该成员函数无参数、返回值为 void int main() { // 成员函数必须加&才能取到函数指针 PtrFunc fp = &OB::func; OB temp; // 通过对象调用成员函数指针 (temp.*fp)(); //temp.func(); return 0; }

类成员函数形式

上述运算符重载成全局函数,所以不得不解除类成员私有。为了类的安全性,一般可以将运算符重载为类成员函数(注意类成员函数第一个参数为隐藏的this指针,实际传参不能传递第一个参数,以保持参数个数与操作数个数一致。(还有两种方法C++不常使用:1. 创建类函数get,set,get:返回类成员变量的引用(推荐加const)/;set:传值修改类成员变量的值 2. 友元)

class Date
{
public:
Date(int year = 1, int month = 1,int day = 1)
{
_year = year;
_month = month;
_day = day;
}

bool operator==(Date& d)
{
return this->_year == d._year
&& this->_month == d._month
&& this->_day == d._day;
}

private:
int _year;
int _month;
int _day;
};

int main()
{
Date d1(2024, 4, 1);
Date d2(2024, 4, 2);

//显示调用
cout<<d1.operator==(d2)<<endl;//直接去类中调用重载

//转换调用(编译器转换)
cout << (d1 == d2) << endl;//先检查类中是否重载,再检查全局是否重载(都有则优先使用类中函数)
return 0;
}

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

相关文章:

  • Mac能够连接校园网,但是无法上网
  • Ubuntu 22.04远程桌面连接失败?别急,可能是Wayland在捣鬼(附ToDesk/向日葵解决方案)
  • HP-Socket代码质量改进会议议程模板:标准与灵活项目
  • C++11——右值引用和移动语义
  • LightOnOCR-2-1B与MySQL集成:构建文档内容检索系统
  • Stable Diffusion像素化技术解析:Pixel Fashion Atelier预设指令集底层逻辑
  • OpenSSH用户枚举漏洞(CVE-2018-15473)修复实战:从检测到升级的完整指南
  • DanKoe 视频笔记:创作者经济:超越细分市场,构建你的个人品牌实现金字塔 [特殊字符]️
  • 从SWF中提取用户界面组件规范:JPEXS Free Flash Decompiler设计系统
  • 多场景智能听书:Koodo Reader TTS语音朗读的深度解析与应用实践
  • s2-pro语音合成教程:通过API批量提交任务+异步结果回调实现
  • Qwen2.5-72B-GPTQ-Int4保姆级教程:log排查技巧+Chainlit响应延迟优化
  • vue-pure-admin 常见问题解决方案
  • 别再手动画圈了!用高德地图猎鹰服务API,5分钟搞定电子围栏(附Postman完整调试流程)
  • Soybean Admin 项目中自定义 Content-Type 的实现方法
  • Cesium使用
  • Kite错误处理最佳实践:如何优雅处理微服务中的异常
  • StructBERT情感分类模型在宠物评论分析中的应用
  • 【FastAPI 2.0流式AI响应终极指南】:20年架构师亲授异步SSE/Chunked Transfer实战避坑清单
  • Visual-ERM:如何让AI精准判断代码视觉效果?
  • 【亲测免费】 探索IREE:中间表示执行环境的未来
  • LeetCode 101. 对称二叉树:递归与迭代的完美结合
  • 3个惊喜功能:让Markdown Viewer成为你浏览器的得力助手
  • NaViL-9B实战手册:图文问答+纯文本问答双路径使用指南
  • 硬盘健康监测工具DiskInfo:从基础监控到高级应用全指南
  • Spring_couplet_generation 使用ComfyUI?探讨不同WebUI框架的部署选择
  • 便携·快检·18.88万:金属3D打印应力检测门槛大幅降低
  • 如何从零构建自己的地震监测系统:10个核心模块实战指南
  • OWL ADVENTURE STM32嵌入式部署初探:将轻量模型移植到C8T6开发板
  • HP-Socket开发者职业发展路径图:从初级到高级网络通信专家的完整指南 [特殊字符]