




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第C++設(shè)計(jì)與聲明超詳細(xì)講解目錄讓接口被正確使用不易被誤用寧以pass-by-reference-to-const替換pass-by-value必須返回對象時將成員變量聲明為private以non-membernon-friend替換member函數(shù)non-member考慮寫出一個不拋出異常的swap函數(shù)
讓接口被正確使用不易被誤用
除非有好的理由,否則應(yīng)該讓你的types的行為與內(nèi)置types一致,請拿ints做范本
提供行為一致的接口!
阻止誤用的辦法包括建立新類型,限制類型上的操作,束縛對象值(比如要統(tǒng)計(jì)年月日,限制月的大小在1-12),消除客戶的資源管理責(zé)任(智能指針)
shared_ptr支持定制型刪除器,可被用來自動解除互斥鎖等
寧以pass-by-reference-to-const替換pass-by-value
值傳遞要調(diào)用copy構(gòu)造函數(shù),釋放時要調(diào)用多次析構(gòu)函數(shù)(有副本),費(fèi)時
const的必要性:引用傳遞代替值傳遞時,確保不會對傳入的數(shù)據(jù)做改變
防止被切割:
classWindow{
public:
virtualvoiddisplay();
classWindowWithScrollBars:publicWindow{
public:
virtualvoiddisplay();
voidshow(Windoww){
w.display();
}
當(dāng)用一個WindowWithScrollBars對象傳入show時,因?yàn)槭侵祩鬟f,會導(dǎo)致其特化信息被切割,變成了一個Window對象!無法多態(tài)了!
應(yīng)該如下:傳進(jìn)來的窗口是什么類型,w就表現(xiàn)出哪種特性
voidshow(constWindoww){
}
說到底,引用是指針實(shí)現(xiàn)出來的,引用傳遞說到底也是傳遞的指針,如果有一個對象屬于內(nèi)置類型,值傳遞效率會比引用傳遞效率高一些。
值傳遞對于內(nèi)置類型和STL的迭代器和函數(shù)對象來說代價不貴,其他類型還是選用const引用傳遞好!
必須返回對象時
別妄想返回reference
不是所有情況都是引用傳遞好
constAoperator*(constArhs){
Aresult(rhs);//調(diào)用構(gòu)造函數(shù)
returnresult;
}
返回了一個result的引用,但result是一個局部變量,離開作用域就被析構(gòu)了?。?!
引用不能返回一個局部對象,否則一敗涂地
一個必須返回新對象的函數(shù)的做法是:就讓他返回一個新對象唄
constAoperator*(constArhs){
Aresult(rhs);//調(diào)用構(gòu)造函數(shù)
returnA(rhs);
}
承受一個operator*構(gòu)造和析構(gòu)函數(shù)的代價即可
絕對不要返回一個指針或引用指向一個localstack對象(出作用域會被析構(gòu)),或返回引用指向一個heap-allocated對象(無法保證合理的delete),或返回指針或引用指向一個localstatic對象而有可能同時需要多個這樣的對象(一個指針修改了指向?qū)ο蟮膮?shù)后,其他指針指向的參數(shù)也被修改了)
將成員變量聲明為private
語法一致性:成員變量不是public,用戶只能通過public里的相應(yīng)函數(shù)來訪問成員變量,用戶使用時就都有一致的使用規(guī)則(全都要使用小括號等)
使用函數(shù)可以對成員變量的處理有更精確的控制,如可以編寫const函數(shù)實(shí)現(xiàn)只讀訪問,不加const實(shí)現(xiàn)讀寫訪問等
封裝性,防止成員變量被更改
假如有一個public成員變量,我們最終取消了它,所有使用它的代碼都會被破壞,假如有一個protected成員變量,我們最終取消了它,所有使用它的派生類都會被破壞。因此protected其實(shí)并不比public更加具有封裝性
說到底,選擇private就好
以non-membernon-friend替換member函數(shù)
能夠訪問private成員變量的函數(shù)只有class的member函數(shù)加上friend函數(shù),如果要在一個member函數(shù)(不只可以訪問private數(shù)據(jù),也能取用private函數(shù)、enums、typedefs等)和一個non-member,non-friend函數(shù)做抉擇,較好封裝性的時后者。因?yàn)樗⒉辉黾幽軌蛟L問class內(nèi)private成分的函數(shù)數(shù)量
將所有便利函數(shù)放在多個頭文件內(nèi)但同屬于一個命名空間,用戶可以輕松添加這一組便利函數(shù),即可以添加更多的non-member,non-friend函數(shù)到此命名空間
參考C++標(biāo)準(zhǔn)程序庫,vector、algorithm等,導(dǎo)入頭文件再進(jìn)行調(diào)用,即可完成很多事情
non-member
若所有參數(shù)皆需要類型轉(zhuǎn)換,請為此采用non-member函數(shù)
classRational{
public:
Rational(intnumerator=0,intdenominator=1);
intnumerator()const;
intdenominator()const;
constRationaloperator*(constRationalrhs)const;
Rationalonehalf(1,2);
Rationalresult=onehalf*2;//很好!
Rationalresult=2*onehalf;//不行!
原因在于:
result=onehalf.operator*(2);//發(fā)生了隱式轉(zhuǎn)換得益于之前沒有將構(gòu)造函數(shù)聲明為explicit
result=2.operator*(onehalf);
2沒有相應(yīng)的class,沒有operator*成員函數(shù),當(dāng)然無法執(zhí)行
結(jié)論為:只有當(dāng)參數(shù)被列于參數(shù)列內(nèi),這個參數(shù)才是隱式轉(zhuǎn)換的合格參與者
改變做法為將operator*變成non-member函數(shù),允許編譯器在每個實(shí)參上執(zhí)行隱式轉(zhuǎn)換
operator*是否應(yīng)該成為class的一個friend函數(shù)呢?否定的,因?yàn)閛perator*完全可以借用Rational的public接口完成任務(wù),這告訴我們:member函數(shù)的反面是non-member,而不是friend
如果你需要為某個函數(shù)的所有參數(shù)(包括this指針?biāo)傅哪莻€隱喻參數(shù))進(jìn)行類型轉(zhuǎn)換,那么這個函數(shù)必須是non-member
考慮寫出一個不拋出異常的swap函數(shù)
當(dāng)做swap時,如果交換內(nèi)部的指針,效率就高了呀
以指針指向一個對象,內(nèi)含真正的數(shù)據(jù),即pimpl手法(pointertoimplementation)
classWidgetImpl{
public:
private:
inta,b,c;
classWidget{
public:
voidswap(Widegetother){
usingstd::swap;//必要的,在找不到class里的swap函數(shù)調(diào)用此函數(shù)
swap(p,other.p);
private:
WidgetImpl*p;
//修訂后的std::swap特化版本
namespacestd{
template
voidswapWidget(Widgeta,Widgetb)
a.swap(b);//調(diào)用a的swap成員函數(shù)
}
這種方法和STL有一致性,因?yàn)镾TL也提供有public的成員函數(shù)和std::swap的特化版本
如果swap的默認(rèn)版本的效率你可以接受,那不需要做任何事
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 生態(tài)環(huán)保型海綿城市透水鋪裝施工合同
- 智能化生產(chǎn)線工人安全責(zé)任勞務(wù)合同
- 醫(yī)療機(jī)構(gòu)感染防控體系建設(shè)與疫情防控演練合同
- 跨國房產(chǎn)抵押貸款合同履行及監(jiān)督協(xié)議
- 業(yè)務(wù)軟件許可合同范例
- 個體雇傭合同范例
- 入伙做生意合同樣本
- 停息掛賬協(xié)議合同范例
- 主播藝人簽約合同范例
- 仲裁聘用合同范例
- 2024年浙江省仙居縣事業(yè)單位公開招聘教師崗筆試題帶答案
- 2025年地理高考復(fù)習(xí) 專題05“演變過程類”選擇題答題技巧(解析版)
- 軟切片安全挑戰(zhàn)-全面剖析
- 生活垃圾合同終止協(xié)議
- 運(yùn)動康復(fù)與體能訓(xùn)練理療中心商業(yè)計(jì)劃書
- 山東能源電力集團(tuán)招聘筆試題庫2025
- GB/T 3091-2025低壓流體輸送用焊接鋼管
- 醫(yī)療技術(shù)品牌的創(chuàng)新與傳播策略
- 湖北省武漢市2025屆高中畢業(yè)生四月調(diào)研考試生物試題及答案(武漢四調(diào))
- 陪護(hù)公司管理制度規(guī)范
- 2024年天津卷高考語文真題含解析
評論
0/150
提交評論