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 &,自定義類 &);
C++對運算符進行重載學習筆記