运算符重载
运算符重载:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型
1.加号运算符重载
2.左移运算符重载
一般输出时 cout<<p.m_A<<" "<<p.m_B<<endl; 但是现在想用<<直接输出p,(直接输出类类型的p, cout<<p<<endl; )该怎么办呢?
利用成员函数重载 左移运算符 p.operator<<(cout) 简化版本: p<<cout ;
不会利用成员函数重载<<运算符,因为无法实现cout在左侧;so用全局函数。
cout是在ostream类下的一个对象,且只有唯一一个,所以要加&;
没完呢 !!!此时还不能再追加一个东西如 cout<<p<<endl; 因为cout<<p;之后返回的不是cout,那怎么让cout调用<<完还是cout呢?(链式编程思想)
接下来:
3.递增运算符重载
1 #include<iostream> 2 using namespace std; 3 //前置递增返回引用,后置递增返回值 4 class HH 5 { 6 public: 7 int m_num; 8 HH() 9 { 10 m_num=0; 11 } 12 //前置++ 13 HH& operator++() 14 { 15 //先++ 16 m_num+=4; 17 //再返回 18 return *this; 19 } 20 //后置++ 21 HH operator++(int)//int是占位参数,防止与前面的一样 22 { 23 //先记录当前值 24 HH temp=*this;//错误样例:HH temp=m_B; 25 //再++ 26 m_num+=3; 27 //最后返回记录值 28 return temp; 29 } 30 }; 31 32 //左移运算符重载 33 ostream& operator<<(ostream& cout,HH myint) 34 { 35 cout<<myint.m_num; 36 return cout; 37 } 38 void test01() 39 { 40 HH p; 41 cout<<++p<<endl; 42 cout<<p++<<endl; 43 } 44 int main() 45 { 46 test01(); 47 }
4.赋值运算符重载
赋值运算符operator=,对属性进行值拷贝
如果类中有属性指向堆区,做赋值操作时也会出现深浅拷贝问题
若p1=p2;那么再(p1,p2)析构时,浅拷贝会重复释放同一块内存.
!!!但是此时还不能做连等(p3=p2=p1);
5.关系运算符重载
重载关系运算符后,可以让两个自定义类型对象进行对比操作
6.函数调用运算符重载
函数调用运算符()也可以重载,由于重载后使用的方式非常像函数的调用,因此称为仿函数。仿函数无固定写法,非常灵活。
仿函数使用非常灵活,如下面的加法类:
匿名函数对象:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!