C 多型性之運算子過載

2021-10-07 02:00:10 字數 3131 閱讀 4345

運算子過載為非成員函式

當c++不存在某些現實中存在的運算(比如複數的加減)或不存在滿足我們要求的運算子時,我們可以對運算子進行過載。

過載為成員函式的運算子函式定義形式為:

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

此時引數即形參的個數=原運算元-1(後置++,–除外,因為這兩個需要額外加乙個int型別的形參來區分是前置或還是後置運算子)

以下兩種情況運算子不能過載為成員函式:

1.當過載為成員函式的運算子時,左運算元一定是類的物件,不能為其他型別,比如過載實數+複數時,實數不是自定義的複數類,不能採用過載為類成員函式的形式。

2.當左運算元是類成員,但是這個類不是由自己定義的,比如是類庫中的類,此時,不能直接在此類中增加成員函式對運算子進行過載。

注:存在必須過載為類成員函式的操作符:賦值(=),下標 ([ ]),呼叫(( )),成員訪問(->)。參考

雙目運算子過載規則:如果要過載運算子o為類成員函式,使之能夠實現表示式 oprd1 o oprd2,其中oprd1為a類物件,那麼運算子o應該過載為a類的成員函式,形參型別應該是oprd2所屬型別。

經過載後,表示式oprd1 o oprd2就相當於oprd1.operator o(oprd2);

以下程式對複數的雙目加減運算進行了過載,實現了複數的加減:

class

complex

complex operator+(

const complex &c2)

const

complex operator-(

const complex &c2)

const

void

display()

private

:double real;

double imag;};

intmain()

前置的單目運算子過載規則

如果要過載o為類成員函式,使之能夠實現表示式 o oprd,其中oprd為a類物件,那麼運算子o應該過載為a類的成員函式,形參型別應該為空。

經過載後,表示式o oprd就相當於oprd.operator o();

後置的單目運算子過載規則

與前置規則一致,只是必須具有乙個int型別的形參。

經過載後,表示式oprd o就相當於oprd.operator o(int);

注:這個int型別的形參只是用來區分是前置還是後置運算子,無引數為前置,有引數為後置,且這個引數在函式體中不能夠使用。

在以下**中實現對時鐘的讀秒++運算:

從執行結果來看可知對++運算進行了過載,使之實現了時鐘的+1。同時,也加深我們對i++和++i的理解,i++是對現有結果輸出,同時+1;++i則是對現有結果+1之後再輸出。

過載為非成員函式的運算子過載規則:

1.函式的形參列表表依次從左向右的的次序排列各運算元;

2引數的個數=原運算元個數(後置的++,–等除外,因為要加乙個int型別的形參區分前置還是後置);

3.至少應該有乙個自定義型別的運算元,不能兩個運算元都是基本型別的,比如不能過載乙個兩個實數的加法,這是不允許的。

雙目運算子經過載後,表示式oprd1 o oprd2就相當於operator o(oprd1,oprd2);

前置單目運算子過載後,表示式o oprd就相當於operator o(oprd);

後置單目運算子過載後,表示式oprd o就相當於operator o(oprd,0);

看以下例子完成對複數的加減過載為非成員函式:

class

complex

complex

(int a,

int b)

:real

(a),

imag

(b)friend complex operator+(

const complex &c1,

const complex &c2 )

;//宣告為友元使得能夠訪問類的私有變數

friend complex operator-(

const complex &c1,

const complex &c2 )

;friend ostream &

operator

<<

(ostream &out,

const complex &c )

;void

show()

private

:int real;

int imag;};

complex operator+(

const complex &c1,

const complex &c2 )

complex operator-(

const complex &c1,

const complex &c2 )

ostream &

operator

<<

(ostream &out,

const complex &c )

intmain()

上述程式中將運算子過載為非成員函式,並將其宣告為複數類的友元,使得能在在類外訪問類的私有成員,其實也可以通過類的共有介面去訪問類的私有成員,但是宣告為友元運算的效率會高一些。

同時對雙目《運算進行了過載,實現了直接輸出複數的形式。注意在過載時,左運算元是std::ostream的引用,右運算元是複數類的常引用,返回std::ostream引用實現多級的輸出。

C 多型性(2) 運算子過載

1.運算子過載的作用是什麼?它允許你為類的使用者提供乙個直覺的介面。運算子過載允許c c 的運算子在使用者定義型別 類 上擁有乙個使用者定義的意義。過載的運算子是函式呼叫的語法修飾 2.算符過載的好處是什麼?通過過載類上的標準算符,你可以發掘類的使用者的直覺。使得使用者程式所用的語言是面向問題的,而...

C 多型性(3) 運算子過載2

運算子過載的函式一般地採用如下兩種形式 成員函式形式和友元函式形式。這兩種形式都可訪問類中的私有成員。1.過載為類的成員函式 這裡先舉乙個關於給複數運算過載複數的四則運算符的例子。複數由實部和虛部構造,可以定義乙個複數類,然後再在類中過載複數四則運算的運算子。先看以下源 該程式的執行結果為 c1 c...

c 多型性,多型,和過載

多型性分兩個部分 1.靜態多型性 通過過載實現,同名不同參。2.動態多型性 多型,子類覆蓋父類方法,執行時根據指標的型別來決定最終執行的方法。即 虛函式。過載是同名不同參,引數完全一樣順序不同也叫同名不同參。參考 在同乙個作用域內,可以宣告幾個功能類似的同名函式,但是這些同名函式的形式引數 指引數的...