递增运算符( ++ )和递减运算符( -- )是 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
标签:return,temp,++,运算符,--,int,重载,Check From: https://www.cnblogs.com/uacs2024/p/18050138