1. 程式人生 > >C++對運算子進行過載學習筆記

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  &,自定義類  &);