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