国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++primer第四版第十四章第十五章

2019-11-08 01:44:44
字體:
供稿:網(wǎng)友

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)垂懸指針的情形。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 扎囊县| 苏尼特左旗| 衡东县| 汉源县| 家居| 山东省| 慈利县| 涡阳县| 山丹县| 东城区| 凤阳县| 双鸭山市| 余干县| 常熟市| 葵青区| 三都| 江口县| 安义县| 马边| 开封市| 浮山县| 左贡县| 望江县| 常德市| 西宁市| 怀来县| 定襄县| 博爱县| 广元市| 山阴县| 扎赉特旗| 邵东县| 苏尼特右旗| 枣庄市| 濉溪县| 北海市| 岫岩| 泗阳县| 桃江县| 来凤县| 仪陇县|