Talk is cheap, show me the code.
重載操作符時(shí)需要區(qū)分有些重載函數(shù)適合放在類內(nèi)部,有些重載函數(shù)不適合放在類內(nèi)部。自增自減操作符,解引用操作符重載函數(shù)適合放在類內(nèi)部,但是四則算數(shù)運(yùn)算操作符,相等不等操作符,關(guān)系操作符和位操作符一般定義為普通非成員函數(shù)(需要用到類成員變量時(shí),可以將重載函數(shù)設(shè)為類的友元函數(shù))。
流重載操作符只能作為普通非成員函數(shù),然后將重載函數(shù)置為類的友元函數(shù)。
如果重載自增自減操作符,要注意區(qū)分前綴自增自減和后綴自增自減的區(qū)別。
前綴自增自減操作符重載:
Object& Operator++(){this->val++; return *this};
后綴自增自減操作符重載,需要額外添加一個(gè)形參以區(qū)分前綴自增自減操作符,而且這里不能直接返回*this,這是后綴操作符的特點(diǎn):
Object operator++(int){Object obj(*this); obj.val++; return obj;};
保留字virtual的目的是啟動(dòng)動(dòng)態(tài)綁定。virtual只能用在類內(nèi)部聲明方法時(shí)添加,不能在類外部定義方法時(shí)添加。C++的函數(shù)默認(rèn)不使用動(dòng)態(tài)綁定,要觸發(fā)動(dòng)態(tài)綁定,必須滿足兩個(gè)條件:第一,只有指定為虛函數(shù)的成員函數(shù)才能進(jìn)行動(dòng)態(tài)綁定,成員函數(shù)默認(rèn)為非虛函數(shù),非虛函數(shù)不適用動(dòng)態(tài)綁定;第二,必須通過基類類型的引用或指針進(jìn)行函數(shù)調(diào)用。當(dāng)基類類型的引用或指針已經(jīng)指向繼承類時(shí),如果要調(diào)用基類的方法,則必須使用域作用符。下面的例子中可以看到, 指向繼承類的ptr調(diào)用沒有加virtual 的show函數(shù)結(jié)果還是調(diào)用的基類的show方法,加了virtual之后才會(huì)動(dòng)態(tài)綁定到繼承類的方法,這點(diǎn)要尤其注意。另外帶有默認(rèn)實(shí)參的動(dòng)態(tài)綁定需要注意,雖然調(diào)用的是繼承類的方法,但是默認(rèn)實(shí)參使用的還是基類的默認(rèn)實(shí)參,這是因?yàn)榛惖哪J(rèn)實(shí)參傳遞給了繼承類的方法。
class Base { public: void show(){cout << "this is base" << endl;}; void show(string b){cout << "derive show: " << b << endl;}; void output(){cout << "output function" << endl;}; virtual void display(string b = "he"){cout << "base: " << b << endl;}; }; class Derive { public: void show(){cout << "this is derive" << endl;}; void display(string b = "hello"){cout << "derive: " << b << endl;}; }; int mian() { Derive d; Base *ptr = &d; ptr->show(); //輸出為 this is base ptr->display(); //輸出為 derive: he ptr->display("lee"); //輸出為 derive: lee d.show(); //輸出為 this is derive d.show("h23"); //編譯錯(cuò)誤,C++中繼承類和基類不構(gòu)成重載關(guān)系 d.output(); //輸出為 output function }
class與struct的區(qū)別有兩個(gè):第一,class的成員默認(rèn)權(quán)限是PRivate,struct的成員默認(rèn)權(quán)限是public;第二,繼承時(shí)class的繼承權(quán)限默認(rèn)是private,struct繼承的默認(rèn)權(quán)限是public。
類如果存在繼承關(guān)系,基類的析構(gòu)函數(shù)必須設(shè)置為虛函數(shù)。
繼承類中重載了基類函數(shù),繼承類的對象或指針只能調(diào)用繼承類中重載了的函數(shù),不能調(diào)用到基類的函數(shù)。但如果不是同名重載的函數(shù),繼承類的對象或指針還是能調(diào)用到基類中的函數(shù)。詳見第4條中的例子
C++中繼承類和基類之間不構(gòu)成重載關(guān)系,也就是說基類的同名函數(shù)沒有在繼承類中覆蓋,那么繼承類對象或指針不能調(diào)用到基類的該函數(shù)。C++中的動(dòng)態(tài)綁定,或者成為多態(tài)性必須由virtual關(guān)鍵字來實(shí)現(xiàn),否則基類指針或引用指向繼承類,調(diào)用的同名函數(shù)也還是基類的函數(shù)。java中繼承規(guī)則簡單一些,基類和繼承類也構(gòu)成重載關(guān)系,繼承類對象或指針、引用也可以使用基類的函數(shù),比如第4條中d.show(“h23”)也是可以執(zhí)行的。
模板template中class和typename沒有區(qū)別。句柄(handle)其實(shí)是智能指針,兩個(gè)指針指向同一個(gè)對象,當(dāng)某一個(gè)指針刪除了該對象時(shí),另一個(gè)指針就變成了垂懸指針,而兩個(gè)句柄指向同一個(gè)對象,當(dāng)某一個(gè)句柄刪除了該對象時(shí),刪除操作只是將指向該對象的指針計(jì)數(shù)減一,當(dāng)計(jì)數(shù)為0時(shí)才真正刪除該對象,避免出現(xiàn)垂懸指針的情形。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注