C++對運算子進行過載學習筆記
1. 一個類的成員函式是暗含著 this 指標的,eg;
1 #include<iostream> 2 using namespace std; 3 4 class A{ 5 public: 6 A(){ x = 0;} 7 double get_add(A &c); 8 private: 9 double x; 10 }; 11 12 double A::get_add(A &c){ 13 A d; 14 return d.x = x+c.x; //注意這裡的 x+c.x;這個單獨的 x 相當於 this->x 或者 (*this).x;15 }
2. 將運算子過載函式作為類的友元函式和作為類的成員函式的區別:
如果將運算子過載函式作為類的成員函式,它可以通過 this 指標自由地訪問本類的資料成員,因此可以少寫一個函式的引數。但是,必須要求運算表示式(如c1+c2)左側第一個引數是一個類的對 象,而且欲運算子函式的型別相同。
在進行運算子過載的時候,考慮到各方面的因素和程式設計師的習慣,以下僅供參考:
(1) C++規定,賦值運算子=、下標運算子[ ] 、函式呼叫運算子() 、成員運算子 ->必須作為成員函式。
(2)流插入<< 和 流提取運算子 >> 、型別轉寒運算子不能定義為類的成員函式,只能作為友元函式。
(3)一般將單目運算子和複合運算子(+= , -= , /= ,*= , &=, !=,`= ,%= ,>>= ,<<=)過載為成員函式。
(4)一般將雙目運算子過載為友元函式。
運算子過載的宣告方式:
1.過載單目運算子:
1.1 成員函式:
類中宣告: Complex Complex::operator+(Complex &c2); //一個引數,另一個是暗含的this指標。
類外定義: Complex Complex::operator+(Complex &c2){};
1.2 友元函式:
類中宣告:friend Complex operator+(Complex &C1,Complex &c2); //注意有兩個引數了
類外定義:Complex operator+(Complex &C1,Complex &c2){};
2.過載雙目運算子 “==” “>” “<”
類中宣告:friend bool operator==(Complex &c1,Complex &c2);
類外定義:bool operator==(Complex &c1,Complex &c2){};
大於和小於的情況只需要把“==”替換一下就行。
3. 過載單目運算子 "++" "--":
由於單目運算子只有一個運算元,因此運算子過載函式只有一個引數,如果運算子過載函式作為成員函式,則還可以省略此引數。
C++約定:在自增(自減)運算子過載函式中,增加一個int型形參,就是後置自增(自減)運算子函式。
貼個程式碼吧,練練手。
1 #include<iostream> 2 using namespace std; 3 4 class Time{ 5 public: 6 Time(){minute = 0;sec = 0;} 7 Time(int m,int s):minute(m),sec(s){} 8 Time operator++(); 9 Time operator++(int); 10 void display(){cout<<minute<<":"<<sec<<endl;} 11 private: 12 int minute; 13 int sec; 14 }; 15 16 Time Time::operator++() //定義前置自增運算子"++"過載函式 17 { 18 if(++sec>=60) 19 { 20 sec -= 60; 21 ++minute; 22 } 23 return *this; //返回自增加後的當前物件; 24 } 25 26 Time Time::operator++(int) //定義後置自增運算子"++"過載函式 27 { 28 Time temp(*this); //建立臨時物件temp; 29 sec++; 30 if(sec>=60) 31 { 32 sec -= 60; 33 ++minute; 34 } 35 return temp; //返回的是自增前的物件; 36 } 37 38 int main() 39 { 40 Time time1(34,59),time2; 41 cout<<"time:"; 42 time1.display(); 43 ++time1; 44 cout<<"++time1:"; 45 time1.display(); 46 time2 = time1++; 47 cout<<"time++"; 48 time1.display(); 49 cout<<"time2:"; 50 time2.display(); 51 return 0; 52 } 53 /* 54 執行結果: 55 time:34:59 56 ++time1:35:0 57 time++35:1 58 time2:35:0 59 */View Code
程式分析:過載後置資政運算子時,多了一個int型的引數,增加這個引數只是為了與前置自增運算子過載函式有所區別,此外沒有任何作用,在定義函式時也不必使用此引數,因此可省寫引數名,只須在括號中寫int即可。
4. 過載流插入運算子和流提取運算子:
形式:
istream & operator>>(istream &,自定義類 &);
ostream & operator<<(ostream &,自定義類 &);