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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!