C 之運算子過載 1

2021-08-21 11:59:39 字數 3620 閱讀 3245

在前一節中曾提到過,c++中執行時的多型性主要是通過虛函式來實現的,而編譯時的多型性是由函式過載和運算子過載來實現的。這一系列我將主要講解c++中有關運算子過載方面的內容。在每乙個系列講解之前,都會有它的一些基礎知識需要我們去理解。而運算子過載的基礎就是運算子過載函式。所以今天主要講的是運算子過載函式。

1.運算子過載是對已有的運算子賦予多重含義,使同乙個運算子作用域不同型別的資料導致不同行為的發生。比如

1 int i;

2 int i1=10,i2=10;

3 i=i1+i2;

4 std::cout<

在這個程式裡"+"既完成兩個整形數的加法運算,又完成了雙精度型的加法運算。為什麼同乙個運算子"+"可以用於完成不同型別的資料的加法運算?這是因為c++針對預定義基本資料型別已經對"+"運算子做了適當的過載。在編譯程式編譯不同型別資料的加法表示式時,會自動呼叫相應型別的加法運算子過載函式。但是c++中所提供的預定義的基本資料型別畢竟是有限的,在解決一些實際的問題時,往往需要使用者自定義資料型別。比如高中數學裡所提到的複數:

1 class complex //複數類

2 11 }

假如我們建立兩個複數,並用"+"運算子讓它們直接相加:

1 complex com1(10,10),com2(20,20),sum;

2 sum=com1+com2;

那麼會提示沒有與這些運算元匹配的 "+" 運算子的錯誤。這是因為complex類型別不是預定義型別,系統沒用對該型別的資料進行加法運算子函式的過載。c++就為運算子過載提供了一種方法,即運算子過載函式。其函式名字規定為operator後緊跟過載運算子。比如:operator+(),operator*()等。現在我們給上述程式宣告乙個加法運算子的過載函式用於完成複數的加法運算:

1 #include "stdafx.h"

2 #include 3

4 class complex //複數類

5 14 };

15 16 complex operator+(complex com1,complex com2)//運算子過載函式

17 20

21 int main()

22 15 friend complex operator+(complex com1,complex com2);//友元函式過載雙目運算子+

16 void showsum();

17 };

18 19

20 complex operator+(complex com1,complex com2)//友元運算子過載函式

21 24

25 void complex::showsum()

26 15 friend voidoperator++(point& point);//友元函式過載單目運算子++

16 void showpoint();

17 };

18 19 voidoperator++(point& point)//友元運算子過載函式

20 24

25 void point::showpoint()

26 15 complex operator+(complex com1);//成員函式過載雙目運算子+

16 void showsum();

17 };

18 19

20 complex complex::operator+(complex com1)

21 24

25 void complex::showsum()

26 16 voidoperator++();//成員函式過載雙目運算子++

17 void showpoint();

18 };

19 20

21 void point::operator++()

22 26

27 28 void point::showpoint()

29 12 complex operator+(int x);

13 };

14 15 complex complex::operator+(int x)

16 19

20 int main()

21

如果我們把上述main()主函式實現部分裡的total=com1+5改為total=5+com1;那麼程式就會報錯(沒有與這些運算元匹配的 "+" 運算子),因為左運算元5不是該複數類的物件,不能呼叫相應的成員函式complex operator+(int x),所以編譯錯誤。但如果我們定義一下兩個友元函式就能解決上述的問題:

friend complex operator+(complex com1,int x);

friend complex operator+(int x,complex com1);

3.最後還是一樣,我將用乙個示例來總結一下今天所講的內容(開發工具:vs2010): 

1 #include "stdafx.h"

2 #include 3

4 class complex //複數類

5 15 complex operator+(complex com1);//成員函式過載雙目運算子+

16 //或friend complex operator+(complex com1,complex com2);//友元函式過載雙目運算子+

17 friend complex operator+(complex com1,int x);//友元函式過載雙目運算子+

18 //或complex operator+(int x);

19 friend complex operator+(int x,complex com1);//友元函式過載雙目運算子+

20 void showsum();

21 };

22 23

24 complex complex::operator+(complex com1)

25 28

29 complex operator+(complex com1,int x)//左運算元型別為複數,右運算元的型別為整數

30 33

34 complex operator+(int x,complex com1)//左運算元型別為整數,右運算元的型別為複數

35 38

39 void complex::showsum()

40 59 friend voidoperator++(point& point);//友元函式過載單目運算子++

60 point operator++();//成員函式過載雙目運算子++

61 void showpoint();

62 };

63 64 voidoperator++(point& point)//友元運算子過載函式

C 運算子過載之過載單目運算子

單目運算子只有乙個運算元,但是其過載方法類似於雙目運算子,在這裡以過載單目運算子 為例,介紹單目運算子的過載 注意 和 運算子有兩種使用方式,前置自增運算子和後置自增運算子,它們的作用是不一樣的,為了區分他們,c 約定,在自增 自減 運算子過載函式中,增加乙個int型別的形參,就是後置自增 自減 運...

C 之「運算子過載」

c 可以過載的運算子有 1.前置 和後置 2.前置 與後置 3.運算子 4.運算子 5.流提取與流插入 運算子 特別注意 要對類的物件使用運算子,不能過載的運算子 逗號運算子 includeusing namespace std class operate operate operate int x...

c 之運算子過載

運算子過載是一種形式的 c 多型。過載後的運算子必須至少有乙個運算元是使用者定義的型別。使用運算子時不能違反運算子原來的句法規則。不能建立新的運算子。名稱說明 sizeof sizeof 運算子 成員運算子 成員指標運算子 作用域解析運算子 條件運算子 typeid 乙個 rtti 運算子 cons...