C 學習之路 運算子過載(一)概念 方法及規則

2022-03-06 03:13:54 字數 2572 閱讀 7064

先來說下什麼是過載吧!所謂過載,就是賦予新的含義。過載包括函式過載和運算子過載。函式過載就是對乙個已有的函式賦予新的含義,使之實現新的功能,因此,同乙個函式名就可以用來代表不同功能的函式,也就是一名多用。函式過載在以後的部落格中會陸續介紹,這個系列先只介紹運算子過載。

運算子也可以過載,實際上,我們已經在不知不覺中使用了運算子過載。例如,大家大家已經習慣於用加法運算子「+」對整數、單精度數和雙精度數進行加法,其實,計算機處理整數、單精度數和雙精度數加法的操作方法是不同的,由於c++已經對運算子「+」進行了過載,使「+」能適用於int、float、double型別的不同的運算。

現在要討論的問題是:使用者能否根據自己的需要對c++已經提供的運算子進行過載,賦予它們新的含義,使之一名多用。例如,能否用「+」號進行兩個複數的相加。在c++中是不能在程式中直接用運算子「+」對複數進行相加運算。使用者必須自己設法實現複數相加。

最容易想到的方法是:自己定義乙個專門的函式來實現複數相加。例如:

class complex //定義complex類

2: ;
10:
11: complex complex :: complex_add( complex& c2 ) //定義複數相加函式
12:

此方法採用在complex類中定義complex_add函式,其作用是將兩個複數相加,在該函式體中定義乙個complex類物件c作為臨時物件。其中的賦值語句相當於

2: c.imag = this->imag + c2.imag ;

this是當前物件的指標。

利用上述方法得到的結果是正確的,但呼叫很不方便。人們自然會想到:能否也和整數的加法運算一樣,直接用「+」來實現複數運算,這就需要對「+」進行過載。

運算子過載的方法是定義乙個過載運算子的函式,使指定的運算子不僅能實現原有的功能,而且還能實現函式中指定的新功能。在使用被過載的運算子時,系統就自動呼叫該函式,以實現相應的功能。運算子的過載實質上是函式的過載。

運算子過載的一般格式如下:

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

在上面的一般格式中,operator是關鍵字,是專門用於定義過載運算子的函式的,函式名使用operator和運算子組成

例,對運算子「+」進行過載,使之能用於兩個複數相加:

class complex

2: ;
10:
11: complex complex :: operator + ( complex& c2 )      //定義過載運算子 + 的函式
12:

經過這樣的宣告和定義之後,若c1、c2、c3都是complex類的物件,在進行兩個複數相加時,就可以這樣:

將運算子"+"'過載為類的成員函式後,c++編譯系統將程式中的表示式"c3=c2+c1"解釋為" c1.operator + ( c2 ) ",表示以c2為實參呼叫c1的運算子過載函式operator+,進行兩個複數相加。

通過以上的比較可以看到,無論是通過自定義complex_add函式,還是過載「+」運算子,兩個程式的結構和執行過程基本上是相同的,作用相同,執行結果也相同。那為什麼還要進行運算子過載呢?這就要從使用者的角度來思考問題,雖然過載運算子所實現的功能完全可以由函式實現,但是使用運算子過載能使使用者易於編寫、閱讀和維護。

注意:運算子被過載後,其原有的功能仍然保留,沒有喪失或改變。也就是說同乙個運算子可以代表不同的功能,當編譯系統需要判別該執行哪乙個功能的時候,是根據表示式的上下文決定的,即根據運算子兩側的資料型別來決定的。

總結一下:本來c++提供的運算子只能用於標準型別資料的運算,但c++程式設計的重要基礎是類和物件,如果c++的運算子無法用於類和物件,則類和物件的應用將會受到很大的限制。為了解決這個問題,使類和物件有更強的生命力,c++允許過載現用的運算子,使這些簡單易用、眾所周知的運算子能直接應用於自己定義的類和物件。

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

(2)c++允許過載的運算子。

記住不能過載的運算子:

成員訪問運算子:.

成員指標運算子:*

作用域運算子: ::

長度運算子:sizeof

條件運算子:?:

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

如關係運算子「<」「>」等是雙目運算子,過載後仍為雙目運算子,需要兩個引數。有些運算子既可以作為單目運算子,也可以作為雙目運算子,這就需要分別過載。

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

(5)過載不能改變運算子的結合性。

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

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

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

(9)應當使過載運算子的功能類似於該運算子作用於標準型別資料時所實現的功能。

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

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

C 學習 運算子過載

同函式過載一樣,算數操作符過載能夠帶給我們操作不同資料型別的方法,包括你自己定義的類。我們日常最常用的就是加 減 乘 除,而它們的性質又有些相似。所以,它們的運算子實現方式也有些相似。共有三種實現方式 首先,我們介紹怎樣使用友鄰函式定義操作符過載。看下面的 include class cents 使...

c 學習運算子過載

運算子過載 1 實驗目的 學習掌握重定義與類有關的運算子。把握過載運算子的時機。學習掌握把乙個類物件轉換為另乙個類物件。學習掌握過載為成員與友元的區別及其帶引數的情況。學習掌握值返回與引用返回的區別及應用時機。2 實驗內容 1 生成乙個表示複數的類fs。複數的實部sb和虛部xb作為其資料成員。提供成...