c++複習(八)

       **第八章                    運算符重載*

多態性:操作接口具有表現多種不同形態的能力,在不同環境下對不同的對象具有不同的處理方式,通過綁定實現,編譯是的綁定稱爲早綁定,運行時綁定是等到運行時才把標識符和程序代碼結合起來。

c++幾乎可以重載全部運算符,而且只能重載c++裏已有的,不能重載:".",".*","::”,"?:",重載之後運算符的結合性和優先級都不會改變。

重載爲類的非靜態成員函數,或者非成員函數

雙目運算符重載爲成員函數:
函數類型 operator 運算符(形參)
{

}
參數個數=原操作數個數-1(後置++,–除外)

規則:
如果要重載B爲類成員函數,使之能夠實現表達式oprd1 B oprd2,其中oprd1爲A類對象,則B應該被重載爲A類成員函數,形參類型應該是oprd2所述的類型,經重載後,表達式oprd1和oprd2相當於oprd1.operator B(oprd2)
例題:
將加減運算重載爲附屬類的成員函數,實部和虛部分別相加減,兩個操作數都是附屬類的對象。

單目運算符重載爲成員函數
如果要重載U爲類成員函數,使之能夠實現表達式U oprd,其中oprd爲A類對象,則A應該被重載爲A類的成員函數,無形參,U oprd相當於oprd.opertator U()
後置單目運算符++和–重載規則,如果要重載++或–爲類的成員函數,使之能夠實現表達式oprd++或者oprd–,其中oprd爲A類對象,則++或者–爲A類得成員函數,具有一個int的參數。
經過重載後,表達式爲oprd++相當於oprd.oprator ++(0)

將運算符重載爲非成員函數
函數的形參代表依自左至右次序排列的各操作數
重載爲非成員函數時,參數個數=原操作數個數(後置++,–除外),至少應該有一個自定義類型的參數,後置單目運算符++和–的重載函數,形參列表中要增加一個int,但不必寫形參名,如果在運算符的重載函數中需要操作某類對象的私有成員,可以將此函數聲明爲類得友元。

虛函數:
實現動態綁定的函數,用vitural關鍵字說明的函數,虛函數是實現運行時多態性的基礎,c++中的虛函數是動態綁定的函數,虛函數必須是非靜態的成員函數,虛函數經過派生之後,就可以實現運行過程中的多態,構造函數不能是虛函數,析構函數可以是虛函數。

聲明:virtual 函數類型 函數名(形參名)
虛函數聲明只能出現在類定義中的函數原型聲明中,而不能在成員函數實現的時候,在派生類中可以對基類中的成員函數進行覆蓋,虛函數一般不聲明爲內聯函數,因爲對虛函數的調用需要動態綁定,而內聯函數的處理時靜態的。

虛析構函數:如果打算允許其他人通過基類指針調用對象的析構函數(通過delect這樣是正常的),就需要讓積累的析構函數成爲虛函數,否則執行delete的結果是不確定的。

虛表與動態綁定:
虛表:每個多態類有一個虛表(virtual table),虛表中有當前類的各個虛函數的入口地址,每個對象有一個指向當前類的虛表的指針,(虛指針vptr)
**動態綁定的實現:**構造函數中爲對象的虛指針賦值,通過多態類型的指針或引用調用成員函數時,通過虛指針,找到虛表,進而找到所調用的虛函數的入口地址;通過該入口地址調用虛函數

抽象類:
純虛函數:在基類中聲明的虛函數,它在基類中沒有定義具體的操作內容,要求各派生類根據實際需要定義自己的版本
聲明:virual 函數類型 函數名(參數表)=0;
有純虛函數的類叫做抽象類
語法:class 類名
{
virtual 類型 函數名(參數表)=0;
//其他成員
}

抽象類的作用:
將有關的數據和行爲組合在一個繼承層次結構中,保證派生類具有要求的行爲,對於暫時無法實現的函數,可以聲明爲純虛函數,留給派生類去實現,抽象類只能作爲基類使用,不能定義抽象類的對象。

override:
多態行爲的基礎:基類聲明虛函數,派生類聲明一個函數覆蓋該虛函數,覆蓋要求:函數簽名完全一致
函數簽名:函數名 參數列表 const

final:這個類可以被繼承,但是程序不能被修改,不能被覆蓋

在特定的地方有特定的含義,不要隨便使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章