uacs2024

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

C++ ++ 和 -- 运算符重载

原文

递增运算符( ++ )和递减运算符( -- )是 C++ 语言中两个重要的一元运算符。

1、递增和递减一般是改变对象的状态,所以一般是重载为成员函数。

2、重载递增递减,一定要和指针的递增递减区分开。因为这里的重载操作的是对象,而不是指针(由于指针是内置类型,指针的递增递减是无法重载的),所以一般情况的递增递减是操作对象内部的成员变量。

3、递增和递减分为前置和后置情况,a = ++b;(前置), a = b++;(后置)。因为符号一样,所以给后置版本加一个int形参作为区分,这个形参是0,但是在函数体中是用不到的,只是为了区分前置后置。例如:

复制代码
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string>
 4 #include <iostream>
 5 using namespace std;
 6 // 例如这里的重载递增就是为了增加pos的值
 7 class ca
 8 {
 9 public:    
10     int pos;
11     //前置递增就是增加当前对象的pos的值,并且返回当前对象
12     ca operator++(){
13         pos++;
14         return *this;
15     }
16     //后置递增就是增加当前对象的pos的值,并且返回增加pos之前的该对象
17     ca operator++(int){
18         ca ret = *this;
19         ++*this;        //这个会调用上面的函数,其实这里可以换成pos++;
20         return ret;
21     }
22 };
23 int main()
24 {
25     ca a, b;
26     a.pos = 1;
27     b = a++;
28     cout << "b1:" << b.pos << endl;   // b1:1
29     b = ++a;
30     cout << "b2:" << b.pos << endl;   // b1:3
31     return 0;
32 }
复制代码

结果

b1:1
b2:3

下面的实例演示了如何重载递增运算符( ++ ),包括前缀和后缀两种用法。

复制代码
 1 #include <iostream>
 2 using namespace std;
 3 class Time
 4 {
 5    private:
 6       int hours;             // 0 到 23
 7       int minutes;           // 0 到 59
 8    public:
 9       // 所需的构造函数
10       Time(){
11          hours = 0;
12          minutes = 0;
13       }
14       Time(int h, int m){
15          hours = h;
16          minutes = m;
17       }
18       // 显示时间的方法
19       void displayTime()
20       {
21          cout << "H: " << hours << " M:" << minutes <<endl;
22       }
23       // 重载前缀递增运算符( ++ )
24       Time operator++ ()  
25       {
26          ++minutes;          // 对象加 1
27          if(minutes >= 60)  
28          {
29             ++hours;
30             minutes -= 60;
31          }
32          return Time(hours, minutes);
33       }
34       // 重载后缀递增运算符( ++ )
35       Time operator++( int )         
36       {
37          // 保存原始值
38          Time T(hours, minutes);
39          // 对象加 1
40          ++minutes;                    
41          if(minutes >= 60)
42          {
43             ++hours;
44             minutes -= 60;
45          }
46          // 返回旧的原始值
47          return T; 
48       }
49 };
50 int main()
51 {
52    Time T1(11, 59), T2(10,40);
53    ++T1;                    // T1 加 1
54    T1.displayTime();        // 显示 T1
55    ++T1;                    // T1 再加 1
56    T1.displayTime();        // 显示 T1
57    T2++;                    // T2 加 1
58    T2.displayTime();        // 显示 T2
59    T2++;                    // T2 再加 1
60    T2.displayTime();        // 显示 T2
61    return 0;
62 }
复制代码

结果

H: 12 M:0
H: 12 M:1
H: 10 M:41
H: 10 M:42

注意,int 在 括号内是为了向编译器说明这是一个后缀形式,而不是表示整数

前缀形式重载调用 Check operator ++ () ,后缀形式重载调用 operator ++ (int)。

复制代码
 1 #include <iostream>
 2 using namespace std;
 3 class Check
 4 {
 5   private:
 6     int i;
 7   public:
 8     Check(): i(0) {  }
 9     Check operator ++ ()
10     {
11         Check temp;
12         temp.i = ++i;
13         return temp;
14     }
15     // 括号中插入 int 表示后缀
16     Check operator ++ (int)
17     {
18         Check temp;
19         temp.i = i++;
20         return temp;
21     }
22     void Display()
23     { cout << "i = "<< i <<endl; }
24 };
25 int main()
26 {
27     Check obj, obj1;    
28     obj.Display(); 
29     obj1.Display();
30     // 调用运算符函数,然后将 obj 的值赋给 obj1
31     obj1 = ++obj;
32     obj.Display();
33     obj1.Display();
34     // 将 obj 赋值给 obj1, 然后再调用运算符函数
35     obj1 = obj++;
36     obj.Display();
37     obj1.Display();
38     return 0;
39 }
复制代码

结果:

i = 0
i = 0
i = 1
i = 1
i = 2
i = 1

--运算符重载

 

复制代码
 1 #include <iostream>
 2 using namespace std;
 3 class Check
 4 {
 5   private:
 6     int i;
 7   public:
 8     Check(): i(3) {  }
 9     Check operator -- ()
10     {
11         Check temp;
12         temp.i = --i;
13         return temp;
14     }
15     // 括号中插入 int 表示后缀
16     Check operator -- (int)
17     {
18         Check temp;
19         temp.i = i--;
20         return temp;
21     }
22     void Display()
23     { cout << "i = "<< i <<endl; }
24 };
25 int main()
26 {
27     Check obj, obj1;    
28     obj.Display(); 
29     obj1.Display();
30     // 调用运算符函数,然后将 obj 的值赋给 obj1
31     obj1 = --obj;
32     obj.Display();
33     obj1.Display();
34     // 将 obj 赋值给 obj1, 然后再调用运算符函数
35     obj1 = obj--;
36     obj.Display();
37     obj1.Display();
38     return 0;
39 }
复制代码

 

结果

i = 3
i = 3
i = 2
i = 2
i = 1
i = 2

 

posted on   ᶜʸᵃⁿ  阅读(64)  评论(0编辑  收藏  举报

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