运算符重载

运算符重载:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型

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.函数调用运算符重载

函数调用运算符()也可以重载,由于重载后使用的方式非常像函数的调用,因此称为仿函数。仿函数无固定写法,非常灵活。

 仿函数使用非常灵活,如下面的加法类:

 匿名函数对象:

 

posted @   hello_0  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示