C++核心準(zhǔn)則

介紹
P.4 理想情況下,程序應(yīng)該靜態(tài)類型安全
P.5 編譯時(shí)檢查比執(zhí)行時(shí)檢查更好
P.6 不能在編譯時(shí)檢查的,應(yīng)當(dāng)可以在執(zhí)行時(shí)檢查
接口
I.10 如果必要任務(wù)失敗了,使用異常發(fā)信號
I.11 永遠(yuǎn)不要使用原始指針或引用傳遞所有權(quán)
I.23 盡量不增加函數(shù)的參數(shù)個(gè)數(shù)
I.26 如果想要不同編譯器都能適用的ABI,使用C風(fēng)格規(guī)則子集
I.27 考慮使用指向?qū)崿F(xiàn)的指針技術(shù)獲得穩(wěn)定的ABI
函數(shù)
F.2 一個(gè)函數(shù)只執(zhí)行單一邏輯操作
F.6 如果函數(shù)不會拋出異常,則聲明為noexcept
F.7 對于通常的使用場景,應(yīng)該使用T*或T&參數(shù)而非智能指針。
F.15 優(yōu)先使用簡單、常規(guī)的方式傳遞參數(shù)
F.16 對于輸入?yún)?shù)來說,拷貝代價(jià)小的傳值,其他傳遞const參照
F.18 使用X&&傳遞“將會發(fā)生數(shù)據(jù)移動”的參數(shù)并實(shí)施數(shù)據(jù)移動
F.19 對于只傳遞不處理的參數(shù),使用模板類型TP&&并在傳遞時(shí)使用std::forward
F.20 輸出結(jié)果時(shí)更應(yīng)該使用返回值而不是輸出參數(shù)
F.21 如果需要返回多個(gè)輸出值,最好返回結(jié)構(gòu)體或者tuple
F.25 使用zstring或not_null
F.26 使用unique_ptr
F.44 在不希望得到拷貝而且不需要返回值為空時(shí)返回T&
F.46 main函數(shù)的返回值類型是整數(shù)
譯邊學(xué)-F.4 賦值運(yùn)算符應(yīng)該返回T&
F.48 不要返回使用std:move從局部變量獲得的右值引用
F.50:不愿意使用函數(shù)時(shí)使用lambda表達(dá)式
F.51:如果可以,優(yōu)先選擇缺省參數(shù)而不是重載
F.52:在lambda表達(dá)式中使用引用形式捕捉局部變量
+核心準(zhǔn)則F.53:非局部使用變量時(shí)避免使用值捕捉
類和繼承
C.1:組織相關(guān)數(shù)據(jù)形成結(jié)構(gòu)體或者類
C.2:包含不變式時(shí)用class,否則用struct定義類
C.4:只有直接訪問表達(dá)的函數(shù),才應(yīng)該成為成員
C.6:不要在一條語句內(nèi)聲明類或枚舉值的同時(shí)又定義該類型的變量
C.8:存在非公有成員時(shí),使用class而不是struct定義類
具體類型
構(gòu)造/析構(gòu)和復(fù)制
C.30:如果一個(gè)類需要明確的銷毀動作,定義析構(gòu)函數(shù)
C.31:類請求的所有資源必須在析構(gòu)函數(shù)釋放
C.33:如果類包含擁有所有權(quán)的指針成員,定義析構(gòu)函數(shù)
C.35:基類的析構(gòu)函數(shù)要么是公開的虛函數(shù),要么是保護(hù)的非虛函數(shù)
C.36:析構(gòu)函數(shù)不應(yīng)該失敗
C.40:如果類包含不變式,則定義構(gòu)造函數(shù)
C.41:構(gòu)造函數(shù)生成的對象應(yīng)該被完全初始化
C.42:如果構(gòu)造函數(shù)不能生成合法對象就拋出異常
C.43:保證(值類型)可拷貝類有默認(rèn)構(gòu)造函數(shù)
C.44:默認(rèn)構(gòu)造函數(shù)最好簡單而且不會拋出異常
C.45:使用類內(nèi)初始化器初始化數(shù)據(jù)成員
C.46:默認(rèn)狀態(tài)下明確定義單參數(shù)構(gòu)造函數(shù)
C.47:按照成員變量聲明的次序定義和初始化數(shù)據(jù)成員
C.48:如果構(gòu)造函數(shù)需要用常數(shù)初始化成員,使用類內(nèi)初始化器更合適
C.49:構(gòu)造函數(shù)中應(yīng)該做的是初始化而不是賦值
C.50:如果在構(gòu)造過程中需要“虛行為”,使用工廠函數(shù)
C.51:使用委托構(gòu)造函數(shù)實(shí)現(xiàn)所有構(gòu)造函數(shù)的共通動作
C.60: 拷貝賦值運(yùn)算符應(yīng)該是以const&為參數(shù),返回非常量引用類型的非虛函數(shù)
C.63:保證移動賦值運(yùn)算符為非虛函數(shù),參數(shù)類型為右值引用,返回值為常量引用類型
C.64:移動操作在完成移動之后,移動源對象應(yīng)該保持有效狀態(tài)
C.80:如果明確希望使用默認(rèn)語義,使用=default
C.81:如果不需要默認(rèn)(同時(shí)不需要其他選項(xiàng))行為,使用=delete禁止它們C.82:不要在構(gòu)造函數(shù)或析構(gòu)函數(shù)中調(diào)用虛函數(shù)
C.83:對于值類類型,考慮提供一個(gè)不會拋出異常的交換函數(shù)
C.86:保證==語義遵守操作數(shù)規(guī)則并不會拋出異常
C.90:依靠構(gòu)造函數(shù)和賦值運(yùn)算符,而不是內(nèi)存初始化和內(nèi)存拷貝?
容器和資源管理
C.100:定義容器時(shí)遵從STL標(biāo)準(zhǔn)?
類繼承(面向?qū)ο螅?/strong>
C.120:類層次體系只用于表現(xiàn)固有的階層結(jié)構(gòu)?
C.121:如果基類被用來定義接口,保證它是一個(gè)純虛類?
C.122:需要完全隔離接口和實(shí)現(xiàn)時(shí)用抽象類作為接口?
C.127:包含虛函數(shù)的類應(yīng)該有虛析構(gòu)函數(shù)或保護(hù)析構(gòu)函數(shù)?
C.128:虛函數(shù)應(yīng)該明確定義為virtual,overide或者final
C.129:設(shè)計(jì)類層次關(guān)系時(shí),區(qū)分實(shí)現(xiàn)繼承和接口繼承?
C.130:實(shí)現(xiàn)多態(tài)類的深拷貝時(shí),虛clone函數(shù)要比拷貝構(gòu)造函數(shù)/賦值運(yùn)算符好
C.132:不要沒有理由就將函數(shù)聲明為虛函數(shù)?
C.134:確保所有非常量數(shù)據(jù)成員具有相同的訪問權(quán)限?
C.135:使用多重繼承表現(xiàn)多個(gè)不同種類的接口?
C.136:使用多重繼承表現(xiàn)“實(shí)現(xiàn)屬性”的組合
C.138:使用using為派生類生成重載函數(shù)集合?
覺得本文有幫助?請分享給更多人。
關(guān)注【面向?qū)ο笏伎肌枯p松學(xué)習(xí)每一天!
面向?qū)ο箝_發(fā),面向?qū)ο笏伎迹?/p>
