C 中的運算子過載

2021-09-25 15:29:44 字數 3405 閱讀 5413

所謂過載,就是重新賦予新的含義。函式過載就是對乙個已有的函式賦予新的含義,使之實現新功能。

運算子也可以過載 ..運算子過載是對已有的運算子賦予多重含義...

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

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

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

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

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

(二) c++允許過載的運算子c++中絕大部分的運算子允許過載.

不能過載的運算子只有5個:

(1) 成員訪問運算子.

(2) 作用域運算子∷

(3) 條件運算子?:

(4) 成員指標運算子*

(5) 編譯預處理命令的開始符號#

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

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

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

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

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

// 於上面3..同。

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

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

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

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

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

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

總之,當c++語言原有的乙個運算子被過載之後,它原先所具有的語義並沒有消失,只相當於針對乙個特定的類定義了乙個新的運算子。

運算子過載可以使用成員函式和友元函式兩種形式。可以參考以下的經驗:

(1)只能使用成員函式過載的運算子有:=、()、、->、new、delete。

(2)單目運算子最好過載為成員函式。

(3) 對於復合的賦值運算子如+=、-=、*=、/=、&=、!=、~=、%=、>>=、<<=建議過載為成員函式。

(4) 對於其它運算子,建議過載為友元函式。

運算子過載的方法是定義乙個過載運算子的函式,在需要執行被過載的運算子時,系統就自動呼叫該函式,以實現相應的運算。也就是說,運算子過載是通過定義函式實現的。運算子過載實質上是函式的過載。過載運算子的函式一般格式如下:

函式型別 operator 運算子名稱 (形參表列)

過載為類成員函式時引數個數=原運算元個數-1

(後置++、--除外)

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

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

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

看乙個例項:

#include

using namespace std;

class complex //複數類宣告

//建構函式

complex operator + (complex c2); //+過載為成員函式

complex operator - (complex c2); //-過載為成員函式

void display(); //輸出顯示複數

private: //私有資料成員

double real; //複數實部

double imag; //複數虛部

};complex complex::operator +(complex c2) //過載函式實現

complex complex::operator -(complex c2) //過載函式實現

void complex::display()

程式輸出的結果為:

c1=(5,4i)

c2=(2,10i)

c3=c1-c2=(3,-6i)

c3=c1+c2=(7,14i)

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

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

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

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

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

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

C 中運算子過載

運算子過載使得使用者自定義的資料以一種更簡潔的方式工作。比如int x,y 可以為y x y 而 my c1,c2 如果想使得兩個自定義的物件相加,以前只能調 用函式計算它們的和。而現在只要定義了運算子過載就能實現c1 c1 c2.所謂過載,就是重新賦予新的含義。函式過載就是對乙個已有的函式賦予新的...

C 中運算子過載

運算子過載可以寫在類的內部,也可以寫成全域性函式形式,其中運算子 在過載時必須宣告為類的成員函式 而運算子 sizeof 不能被過載 演算法運算子的過載不會改變運算子原有的優先順序。例子 include include include using namespace std class comple...

C 中的運算子過載(一) 運算子過載的概念

概述 運算子過載,就是對已有的運算子重新進行定義,賦予其另一種功能,以適應不同的資料型別。運算子過載 operator overloading 只是一種 語法上的方便 也就是它只是另一種函式呼叫的方式,只是為了方便我們使用,運算子只能運算內建的資料型別,對於自定義的資料型別不能運算,所以我們可以過載...