C語言中,前置和后置++,--都不能作為左值,而在c++中,前置的++和--可以作為左值,從下面的重載運算符中也可以看出,它們返回的是引用,我不知道為什么這里和c語言中不同,但c++類似的提升還有三目運算符?:,在c中也不可以做左值,但c++中可以。或者是因為c++提出了引用,進而對c做了一定的提升吧。
重載前置++和--,分別采用成員函數和全局函數的方式實現,代碼如下:重載運算符的行為應該和內置類型一致,所以前置的++、--應該返回引用。
1 #include<iostream>
2 using namespace std; 3 class Test { 4 friend Test & operator--(Test &obj); 5 public: 6 Test(int a = 0, int b = 0) 7 { 8 this->a = a; 9 this->b = b; 10 } 11 void display() 12 { 13 cout << "a:" << a << " b:" << b << endl; 14 } 15 public: 16 Test & operator++() 17 { 18 this->a++; 19 this->b++; 20 return *this; 21 } 22 private: 23 int a; 24 int b; 25 }; 26 Test & operator--(Test &obj) 27 { 28 obj.a--; 29 obj.b--; 30 return obj; 31 } 32 int main() 33 { 34 Test t1(1, 2); 35 t1.display(); 36 ++t1; 37 t1.display(); 38 --t1; 39 t1.display(); 40 cout << "hello world!\n"; 41 return 0; 42 }
recommend:
1.賦值(=)、下標([])、調用和成員訪問箭頭(->)運算符必須是成員函數;
2.復合賦值運算符一般來說應該是成員,但並非必須,這一點與賦值運算符略有不同;
3.改變對象狀態的運算符或者與給定類型密切相關的運算符,如遞增、遞減和解引用運算符,通常應該是成員(上述代碼只是為了復習訓練一下全局函數和成員的分別實現,所以沒有遵循這條規則);
4.具有對稱性的運算符可能轉換任一端的運算對象,例如算術、相等性、關系和位運算符等,因此它們通常應該是普通的非成員函數。
總結下來就是,只用記住第四點,其他情況都用成員函數的方式。