運算子過載的函式一般地採用如下兩種形式:成員函式形式和友元函式形式。這兩種形式都可訪問類中的私有成員。
1. 過載為類的成員函式
這裡先舉乙個關於給複數運算過載複數的四則運算符的例子。複數由實部和虛部構造,可以定義乙個複數類,然後再在類中過載複數四則運算的運算子。先看以下源**:
該程式的執行結果為:
c1+c2=6+1i
c1-c2=-2+5i
c1*c2=14+8i
c1/c2=0.45+0.8i
(c1+c2)*(c1-c2)*c2/c1=9.61538+25.2308i
在程式中,類complex定義了4個成員函式作為運算子過載函式。將運算子過載函式說明為類的成員函式格式如下:
<類名> operator <運算子>(<參數列>)
其中,operator是定義運算子過載函式的關鍵字。
程式中出現的表示式:
c1+c2
編譯程式將給解釋為:
c1.operator+(c2)
其中,c1和c2是complex類的物件。operator+()是運算+的過載函式。
該運算子過載函式僅有乙個引數c2。可見,當過載為成員函式時,雙目運算子僅有乙個引數。對單目運算子,過載為成員函式時,不能再顯式說明引數。過載為成員函式時,總時隱含了乙個引數,該引數是this指標。this指標是指向呼叫該成員函式物件的指標。
2. 過載為友元函式
運算子過載函式還可以為友元函式。當過載友元函式時,將沒有隱含的引數this指標。這樣,對雙目運算子,友元函式有2個引數,對單目運算子,友元函式有乙個引數。但是,有些執行符不能過載為友元函式,它們是:=,(),和->。
過載為友元函式的運算子過載函式的定義格式如下:
friend <型別說明符> operator <運算子>(<參數列>)
下面用友元函式**成員函式,過載編寫上述的例子,程式如下
該程式的執行結果與上例相同。前面已講過,對又目運算子,過載為成員函式時,僅乙個引數,另乙個被隱含;過載為友元函式時,有兩個引數,沒有隱含引數。因此,程式中出現的 c1+c2
編譯程式解釋為:
operator+(c1, c2)
呼叫如下函式,進行求值,
complex operator +(const coplex &c1, const complex &c2)
3. 兩種過載形式的比較
一般說來,單目運算子最好被過載為成員;對雙目運算子最好被過載為友元函式,雙目運算子過載為友元函式比重載為成員函式更方便此,但是,有的雙目運算子還是過載為成員函式為好,例如,賦值運算子。因為,它如果被過載為友元函式,將會出現與賦值語義不一致的地方。 其他運算子的過載舉例
1).下標運算子過載
由於c語言的陣列中並沒有儲存其大小,因此,不能對陣列元素進行訪問範圍的檢查,無法保證給陣列動態賦值不會越界。利用c++的類可以定義一種更安全、功能強的陣列型別。為此,為該類定義過載運算子。
下面先看看乙個例子:
該陣列類的優點如下:
(1) 其大小不心是乙個常量。
(2) 執行時動態指定大小可以不用運算子new和delete。
(3) 當使用該類陣列作函式引數時,不心分別傳遞陣列變數本身及其大小,因為該物件中已經儲存大小。
在過載下標運算子函式時應該注意:
(1) 該函式只能帶乙個引數,不可帶多個引數。
(2) 不得過載為友元函式,必須是非static類的成員函式。 2). 過載增1減1運算子
增1減1運算子是單目運算子。它們又有字首和字尾運算兩種。為了區分這兩種運算,將字尾運算視為又目運算子。表示式
obj++或obj--
被看作為:
obj++0或obj--0
下面舉一例子說明過載增1減1運算子的應用。
3). 過載函式呼叫運算子
可以將函式呼叫運算子()看成是下標運算的擴充套件。函式呼叫運算子可以帶0個至多個引數。下面通過乙個例項來熟悉函式呼叫運算子的過載。
C 多型性(2) 運算子過載
1.運算子過載的作用是什麼?它允許你為類的使用者提供乙個直覺的介面。運算子過載允許c c 的運算子在使用者定義型別 類 上擁有乙個使用者定義的意義。過載的運算子是函式呼叫的語法修飾 2.算符過載的好處是什麼?通過過載類上的標準算符,你可以發掘類的使用者的直覺。使得使用者程式所用的語言是面向問題的,而...
C 多型性之運算子過載
運算子過載為非成員函式 當c 不存在某些現實中存在的運算 比如複數的加減 或不存在滿足我們要求的運算子時,我們可以對運算子進行過載。過載為成員函式的運算子函式定義形式為 函式型別 operator 運算子 形參 此時引數即形參的個數 原運算元 1 後置 除外,因為這兩個需要額外加乙個int型別的形參...
c 多型性,多型,和過載
多型性分兩個部分 1.靜態多型性 通過過載實現,同名不同參。2.動態多型性 多型,子類覆蓋父類方法,執行時根據指標的型別來決定最終執行的方法。即 虛函式。過載是同名不同參,引數完全一樣順序不同也叫同名不同參。參考 在同乙個作用域內,可以宣告幾個功能類似的同名函式,但是這些同名函式的形式引數 指引數的...