C 基礎 運算子過載(01)

2021-06-28 12:38:45 字數 2196 閱讀 8648

一方面,在c++中,運算子過載( operator overloading)允許把標準運算子(如+  -  *  /  % 等)應用於自定義資料型別的物件。

這樣可以直觀自然地看出自定義資料型別間的運算,並且提高程式的可讀性。

另一方面,運算子過載僅僅是一種語法上的方便。預設運算子的本質就是函式的呼叫,而運算子過載就是另一種呼叫。

同時,雖然很多時候使用運算子過載可以提高程式的可讀性,但我們不應該過於依賴,甚至是濫用它。只有在所涉及的**更容易表達,尤其是更容易被讀懂時才有必要過載。 例:

#include using namespace std ;

class complex

complex() : real_(0) , imag_(0)

complex add(const complex& other)

~complex() {};

void display() const

};int main(void)

我們在不使用運算子過載的情況下,實現了兩個複數相加的操作。

但是缺點非常明顯,這樣的方式非常不直觀,如果我們希望 complex c3 = c1 + c2 ;

這樣直觀的表現的話,編譯器就會告訴我們,類的物件不能直接參與運算。

但如果我們有了運算子過載這個利器的話,上面的問題就會迎刃而解。

1.成員函式過載

成員函式宣告的格式 :

返回值型別 operator運算子 (引數列表) ;

成員函式定義的格式 :

返回值型別 類名::operator運算子 (引數列表)  :

例:以成員函式實現上面**的功能

complex operator+ (const complex& other) ;

運算子「+」是乙個二元運算子,運算時需要其左邊和右邊的物件,而成員函式必須由類的乙個例項來呼叫,如使用c1呼叫operator+時,編譯器已經知道c1的存在,只需要輸入另乙個物件即可。真實的情況就是成員函式過載運算子時,首先會預設地呼叫隱式指標this,之後才呼叫引數列表中顯式的物件作為引數,因此在成員函式過載時,只需要乙個引數。

下面我們來實現這個新的功能

#include using namespace std ;

class complex

complex() : real_(0) , imag_(0)

complex operator+(const complex& other)

~complex() {};

void display() const

};int main(void)

2. 友元函式過載

c++中的函式一共有兩種形式,成員函式和頂層函式,我們現在來討論頂層函式如何去實現。

首先,普通的頂層函式有乙個致命的缺陷,就是無法訪問類的私有成員。因此我們只有通過友元函式來實現運算子過載。

友元函式宣告原型:

friend 函式原型 operator運算子(引數列表) ;

友元函式定義原型:

friend 函式型別 類名::operator運算子(引數列表) ;

#include using namespace std ;

class complex

complex() : real_(0) , imag_(0)

friend complex operator+(const complex& left , const complex& right) ;

void display()

~complex() {} ;

};complex operator+(const complex& left , const complex& right)

int main(void)

這就是用友元函式實現的運算子過載。

3. 運算子過載的規則

①. 運算子過載不允許發明新的運算子;

②. 不能改變原有運算子操作物件的個數,即單目不得變雙目等;

③. 運算子被過載後,其優先順序和結合性不得發生改變

④. 不得被過載的運算子:作用於運算子::

條件運算子  ? :

直接成員運算子 .

類成員一直引用  ->

sizeof運算子 sizeof

C 基礎 運算子過載

運算子過載 返回值型別 類名 operator過載運算子 引數列表 include using namespce std class complex ostream operator ostream out,const complex c 過載輸出流 class complex complex pu...

C 基礎 運算子過載

一 運算子過載 1.類是使用者自定義的資料型別,使用運算子過載可以i實現如下邏輯 1 物件1 物件2 物件3,如描述複數的類,描述字串的類。2 提高程式的可讀性。2.過載賦值運算子 1 如果乙個類沒有提供賦值運算函式,則預設提供乙個。2 如果乙個類提供了拷貝建構函式,那麼也要提供乙個過載的賦值運算函...

C 基礎(4) 運算子過載

二.使用過載運算子 c 預定義中的運算子的操作物件只侷限於基本的內建資料型別,但是對於我們自定義的型別 類 是沒有辦法操作的。但是大多時候我們需要對我們定義的型別進行類似的運算,這個時候就需要我們對這麼運算子進行重新定義,賦予其新的功能,以滿足自身的需求。運算子過載的實質就是函式過載或函式多型。運算...