運算子過載

2022-03-28 02:38:00 字數 2930 閱讀 9239

c++中預定義的運算子的操作物件只能是基本資料型別。但實際上,對於許多使用者自定義型別(例如類),也需要類似的運算操作。這時就必須在c++中重新定義這些運算子,賦予已有運算子新的功能,使它能夠用於特定型別執行特定的操作。運算子過載的實質是函式過載,它提供了c++的可擴充套件性,也是c++最吸引人的特性之一。 

過載完之後,會根據我們定義的過載函式 自動呼叫最符合呼叫的方法使用...比如我們定義的類的過載運算子+. 當我們使用類的物件相加時,會自動呼叫我們定義的過載...而當我們使用內建的+法運算,比如 int b=5+3; 那麼這是還是呼叫內建的+法運算進行處理 ..

c++中預定義的運算子其運算物件只能是基本資料型別,而不適用於使用者自定義型別(如類).

同上,內建的運算子 只能應用於內建的資料型別 ...比如 int char double .等等。

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

// 就是說只能過載內建的 + - * / 等運算子,不能自己創造運算子計算。 。

(三) 過載不能改變運算子運算物件(即運算元)的個數。

// 不能改變運算子運算物件, 比如+法運算子,那麼它有兩個運算元 ..當我們過載它的時候 也只能有兩個運算元 。

(四) 過載不能改變運算子的優先級別。

// 過載完之後並不能改變它的優先級別,比如 +號, 無論你怎麼設計過載函式. 它永遠不可能比()的優先順序高......

(五) 過載運算子的函式不能有預設的引數,否則就改變了運算子引數的個數,與前面第(3)點矛盾。

// 於上面3..同。

(六) 過載的運算子必須和使用者定義的自定義型別的物件一起使用,其引數至少應有乙個是類物件(或類物件的引用)。也就是說,引數不能全部是c++的標準型別,以防止使用者修改用於標準型別資料的運算子的性質。

// 過載的引數不能全部是c++內建資料型別。 至少要有乙個是自定義型別。因為如果我們定義的是兩個內建的型別 就會跟系統所定義的衝突。 因為當我們使用內建的運算子時,那麼編譯器其實也是呼叫的乙個過載運算子進行計算。這是編譯器自動新增的。 如果我們也定義的相同 那麼肯定會產生衝突。

(七) 用於類物件的運算子一般必須過載,但有兩個例外,運算子「=」和「&」不必使用者過載。

① 賦值運算子(=)可以用於每乙個類物件,可以利用它在同類物件之間相互賦值。

② 位址運算子&也不必過載,它能返回類物件在記憶體中的起始位址。

// 前面已經說過,c++內建運算子只能計算內建的資料型別 。所以當我們要使用自定義型別時 就必須要進行過載..

// 當過載為類成員函式時,引數個數等於原來的運算元-1 ..比如 物件a +物件b ..我們過載的時候需要兩個運算元 a 和b 但我們傳遞過去乙個就可以了 , 比如 a+b 我們只需要把b傳遞過去就可以了。因為當呼叫過載運算子時 就是a呼叫的過載運算子,那麼它就是當前物件 它就是這時的this 指標 ..而且類成員函式只能使用兩個類中成員...

過載為友元函式時 引數個數=原運算元個數,且至少應該有乙個自定義型別的形參。

//與上面沒多大區別,但它卻可以呼叫非類中物件.. 比如呼叫乙個物件a+1 ..注意的是即使定義為友元函式,它的運算元也必須有乙個為自定義型別。

下面看乙個例項:

1

: 定義控制台應用程式的入口點。2//

34 #include "

stdafx.h

"5 #include6

7using

namespace

std;89

class

myoperator

1017

18 myoperator operator +( myoperator x );

19 myoperator operator -( myoperator x );

20void

display()

2125

private:26

double

real;

27double

image;

28};

2930 myoperator myoperator::operator +(myoperator x )

3137

38 myoperator myoperator::operator-( myoperator x )

3945

46int

main()

47

通過**我們可以看出: 定義了兩個成員函式過載運算子..過載了+ 和- . 當我們使用這個類的兩個成員進行相加的或者相減的時候就會自動呼叫過載的運算子..使用我們在過載的運算子中所定義的操作。那我們可以看到,在進行+或者 -的時候是把兩個物件中儲存的複數的值進行加減 然後返回了。 要注意的是並不是+號和減號被完全改變了,而只是這個類中的物件在進行+ -操作的時候才會呼叫過載.

我們來測試一下; 我們在main()函式中再定義三個變數 ,int a=5,b=3,c;    c=a-b ; 然後再輸出c的值 ,我們發現輸出為2 . .這也證明了我們所定義的過載運算子並沒有改變它原來的功能..而是賦予了它多重的含義..

那我們再來看下運算子過載在友元函式中的使用。

我們只需要將myoperator myoperator::operator +(complex c2) //過載函式實現

這段** 修改一下... 改為 myoperator friend myoperator::operator +(myoperator c2,myoperator c3)

那麼同樣也可以完成相同的功能..而且還更容易擴充..因為從上面得知..過載的運算子必須和使用者定義的自定義型別的物件一起使用. 也就是說至少有乙個自定義型別..或者是它的引用..如果我們使用成員運算子過載的話只能使用類中的物件成員..而使用友元運算子過載那麼我們則可以使用 類外的資料..當我們需要使用的時候直接修改為 myoperator friend myoperator::operator +(myoperator c2,int a) 如這樣的形式就可以了。

本篇文章**自

運算子過載之過載型別運算子

普通型別 類型別 呼叫對應的只有乙個引數 引數的型別就是這個普通型別 的建構函式 需求 boy boy1 10000 薪資 建構函式boy int boy boy2 rock 姓名 建構函式boy char 普通型別賦值給類型別其實很簡單,就是專門的對這個賦值的型別定義乙個建構函式。編譯器在執行 的...

運算子過載 賦值運算子的過載

有時候希望賦值運算子兩邊的型別可以不匹配,比如,把乙個int型別變數賦值給乙個complex物件,或把乙個 char 型別的字串賦值給乙個字串物件,此時就需要過載賦值運算子 注意 賦值運算子 只能過載為成員函式 賦值運算子過載例項示例 include include using namespace ...

運算子過載

c 中的運算子 1。大多數系統預定義運算子都能過載 不值得過載 不能被過載 2過載不能改變優先順序 不能改變結合性 不能改變運算子所需運算元的個數 過載後,可按這些運算子的表達方式使用 運算子過載的語法 一 通過運算子過載函式進行過載 1。運算子過載函式是成員函式 語法形式 type x opera...