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

C++對運算符進行重載學習筆記

自定義類 hide main 臨時 有一個 ostream oid pri 形參

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++對運算符進行重載學習筆記