C 中的操作符過載

2021-07-13 18:13:00 字數 2919 閱讀 1210

以下**:

一、什麼是操作符過載

操作符過載可以分為兩部分:「操作符」和「過載」。說到過載想必都不陌生了吧,這是一種編譯時多型,過載實際上可以分為函式過載和操作符過載。運算子過載和函式過載的不同之處在於操作符過載過載的一定是操作符。我們不妨先直觀的看一下所謂的操作符過載:

1 #include 2

3using

namespace

std;45

intmain()

6

我們看到操作符「+」完成floatint兩種型別的加法計算,這就是操作符過載了。這些內建型別的操作符過載已經實現過了,但是如果現在我們自己寫過的類也要實現實現類似的加法運算,怎麼辦呢??比如現在現在有這樣乙個點類point,要實現兩個點的相加,結果是橫縱座標都要相加,這時候就需要我們自己寫乙個操作符過載函式了。

1 #include 2

3using

namespace

std;45

class

point614

double

get_y()

1518 point(double x = 0.0 , double y = 0.0

):x(x),y(y){};

19 point operator +(point p);

20};

21//

過載操作符「+」

22 point point::operator +(point p)

2329

intmain()

30

二、實現操作符過載的兩種方式

操作符過載的實現方式有兩種,即通過「友元函式」或者「類成員函式」。

1.友元函式過載操作符的格式:

1

class類名2

;5//類外定義格式:

6返回型別 operator操作符(參數列)

7

2.類成員函式實現操作符過載的格式:

1

class類名2

;6//類外定義格式

7 返回型別 類名::operator

操作符(形參表)

8

這樣說吧,還是不足以比較這兩種實現方式的區別,我們分別用兩種實現方式寫point類的」+「和」-「的過載。**如下:

1 #include 2

3using

std::endl;

4using

std::cout;56

class

point715

double

get_y()

1619 point(double x = 0.0 , double y = 0.0

):x(x),y(y){};

20 friend point operator -(point p1,point p2);

21 point operator +(point p);

22};

23//

過載操作符「-」

24 point operator -(point p1,point p2)

2531

//過載操作符「+」

32 point point::operator +(point p)

3339

intmain()

40

這裡不知道大家看到沒有,利用友元函式過載二元操作符」-「時,形式引數是兩個,而利用類成員函式時,形式引數卻只有乙個。這時因為類成員函式中存在this指標,這相當於乙個引數,所以類成員實現操作符過載需要的形式引數比原來少乙個,這比如:利用類成員函式實現一元操作符」-「,就不需要引數了。也正是因為這個原因,友元函式實現的操作符過載是有限制的,比如: ,(),->和 =不能利用友元函式實現運算子的過載。

在實際開發過程中,單目運算子建議過載為成員函式,而雙目運算子建議過載為友元函式。通常下雙目運算子過載為友元函式比重載為成員函式更方便,但是有時雙目運算子必須過載為成員函式,例如賦值運算子=。還有如果需要修改物件內部的狀態,一般可以選擇利用類成員函式進行修改。

三、運算子過載的原則

這樣一看,運算子過載還是蠻簡單的嘛,實際上運算子過載也是要遵循一些原則的:

1.c++中只能對已有的c++運算子進行過載,不允許使用者自己定義新的運算子。

2.c++中絕大部分的運算子可過載,除了成員訪問運算子

.,作用域運算子::,長度運算子sizeof以及條件運算子?:

3.運算子過載後不能改變運算子的操作物件(運算元)的個數。如:"+"是實現兩個運算元的運算子,過載後仍然為雙目運算子。

4.過載不能改變運算子原有的優先順序和原有的結合性。

6.運算子過載不能全部是c++中預定義的基本資料,這樣做的目的是為了防止使用者修改用於基本型別資料的運算子性質。

四、為什麼要進行運算子過載

關於運算子過載要遵循這麼多原則,那麼為什麼還要進行運算子過載呢?為什麼我不是寫乙個add()函式,代替operator +()呢??個人感覺c++中之所以要支援運算子的過載是為了與內建資料型別統一操作,比如:c = a + b 和 c = add(a,b),這看起來哪個更直觀一點呢,顯然是前者了。同時,我們希望操作我們自己定義的資料型別能像操作int和double這些內建資料型別一樣方便。可能舉這個加法的例子有點不好,現在加入過載的運算子是,<

思考:c++中的++運算子是有兩種的,這個我們怎麼區別過載的是前自增還是後自增呢?

c 中 操作符過載

操作符過載 1.有先後順序,如 t3 t1 t2 則t1 t2等價於t1.operate t2 2.對 操作符進行過載時,如aa是有本質區別的。操作符過載就是用函式的方法對乙個操作符進行重新定義,在該函式中定義了操作符所要完成的功能。其中cout是輸出流ostream中的物件 元素 3.a cout...

C 中 操作符過載

在實際程式中遇到一操作符問題,記錄下來方便以後查詢。在寫hashtable資料結構中,遇到操作符過載問題,具體需求如下 1.a x b 如果a x 為空,則新增記錄 2.b a x 如果a x 為空,則提示出錯 對操作符過載之後發現根本不能解決問題,查詢一些資料後發現該問題為過載後的讀寫問題,乙個過...

c 中過載《操作符

在類定義中,有時候我們需要直接利用cout來列印出類中的資料,此刻就需要過載 操作符來實現 假定定義了乙個類time 然後宣告了乙個類 time a cout 這樣的語法肯定是會報錯的,此刻就需要過載operator 要怎麼做呢?首先,在過載函式中,要訪問到類time中的私有成員的資料,所以我們需要...