<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          f5c0fe3845e63bc155cdc3256a7f3cb6.webp

          介紹

          序言

          摘要

          介紹

          不必驚慌!

          目標(biāo)之外

          實(shí)施建議

          文檔結(jié)構(gòu)

          P:基本原則

          P.1:直接用代碼表達(dá)想法

          P.2 使用ISO標(biāo)準(zhǔn)C++寫代碼

          P.3 表達(dá)意圖

          P.4 理想情況下,程序應(yīng)該靜態(tài)類型安全

          X.3 使用variant代替union

          X.4:使用span解決數(shù)組退化和越界訪問

          X.5:盡量不使用類型轉(zhuǎn)換

          P.5 編譯時(shí)檢查比執(zhí)行時(shí)檢查更好

          P.6 不能在編譯時(shí)檢查的,應(yīng)當(dāng)可以在執(zhí)行時(shí)檢查

          P.7 盡早捕捉執(zhí)行時(shí)錯(cuò)誤

          P.8 不要泄漏任何資源

          P.9 不要浪費(fèi)時(shí)間和空間

          P.10 不變的優(yōu)于可變的

          P.11 封裝混亂的代碼,而不是傳播它們

          P.12: 酌情使用支持工具

          P.13: 酌情使用支持庫

          接口

          I.1: 使接口清晰明確

          I.2:避免非常數(shù)全局變量

          I.6 表達(dá)前提條件最好使用Expects()

          I.7 說明后置條件

          I.8 表示后置條件最好使用Ensures()

          I.10 如果必要任務(wù)失敗了,使用異常發(fā)信號

          I.11 永遠(yuǎn)不要使用原始指針或引用傳遞所有權(quán)

          I.12 用not_null定義不能為空的指針

          I.13 不要直接使用指針傳遞數(shù)組

          I.22 避免對全局對象進(jìn)行復(fù)雜的初始化

          I.23 盡量不增加函數(shù)的參數(shù)個(gè)數(shù)

          I.24 避免相同類型的無關(guān)參數(shù)相鄰

          I.25 在類體系中將抽象類定義成接口會更好

          I.26 如果想要不同編譯器都能適用的ABI,使用C風(fēng)格規(guī)則子集

          I.27 考慮使用指向?qū)崿F(xiàn)的指針技術(shù)獲得穩(wěn)定的ABI

          I.30 封裝必要的違反

          函數(shù)

          F.1:將有意義的操作封裝為精心命名的函數(shù)

          F.2 一個(gè)函數(shù)只執(zhí)行單一邏輯操作

          F.3 保持函數(shù)簡短

          F.6 如果函數(shù)不會拋出異常,則聲明為noexcept

          F.7 對于通常的使用場景,應(yīng)該使用T*或T&參數(shù)而非智能指針。

          F.8 優(yōu)先選擇純函數(shù)

          F.9:不用的參數(shù)應(yīng)該去掉名字

          F.15 優(yōu)先使用簡單、常規(guī)的方式傳遞參數(shù)

          F.16 對于輸入?yún)?shù)來說,拷貝代價(jià)小的傳值,其他傳遞const參照

          F.17 輸入/輸出參數(shù)傳遞非常量引用

          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.22 使用T*或onwer指明唯一對象

          F.23 使用not_null表明“空”是無效值

          F.24 使用span或者span_p表示半開序列

          F.25 使用zstring或not_null表示C風(fēng)格字符串

          F.26 使用unique_ptr代替指針傳遞所有權(quán)

          F.27 使用shared_ptr共享所有權(quán)

          F.42 T*返回值應(yīng)該只用來指明位置

          F.43 永遠(yuǎn)不要返回指向局部對象的指針或引用

          F.44 在不希望得到拷貝而且不需要返回值為空時(shí)返回T&

          F.45 不要返回右值引用

          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í)避免使用值捕捉

          F.54:不要隱式捕捉this指針

          F.55 不要使用可變參數(shù)

          類和繼承

          C.1:組織相關(guān)數(shù)據(jù)形成結(jié)構(gòu)體或者類

          C.2:包含不變式時(shí)用class,否則用struct定義類

          C3

          C.4:只有直接訪問表達(dá)的函數(shù),才應(yīng)該成為成員

          C.5:將幫助函數(shù)和它們支持的類放在同一命名空間

          C.6:不要在一條語句內(nèi)聲明類或枚舉值的同時(shí)又定義該類型的變量

          C.8:存在非公有成員時(shí),使用class而不是struct定義類

          C.9:最小限度暴露成員

          具體類型

          C.10:具體類型要好于類繼承

          C.11:讓具體類型符合常規(guī)

          構(gòu)造/析構(gòu)和復(fù)制

          C.20:盡量避免定義默認(rèn)操作

          C.21:默認(rèn)操作要定義就全定義,要禁止就全禁止

          C.22:保持默認(rèn)操作的一貫性

          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.37:保證析構(gòu)函數(shù)不會拋出異常

          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.52:合理使用繼承的構(gòu)造函數(shù)

          C.60: 拷貝賦值運(yùn)算符應(yīng)該是以const&為參數(shù),返回非常量引用類型的非虛函數(shù)

          C.61:拷貝操作應(yīng)該具有拷貝的效果

          C.62:保證拷貝賦值對自我賦值安全

          C.63:保證移動賦值運(yùn)算符為非虛函數(shù),參數(shù)類型為右值引用,返回值為常量引用類型

          C.64:移動操作在完成移動之后,移動源對象應(yīng)該保持有效狀態(tài)

          C.65:讓移動操作對自賦值安全

          C.66:保證移動操作不會拋出異常

          C.67:多態(tài)類應(yīng)該抑制拷貝

          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.84:swap函數(shù)不應(yīng)該失敗

          C.86:保證==語義遵守操作數(shù)規(guī)則并不會拋出異常

          C.87:小心基類的相等運(yùn)算符

          C.89:保證哈希不會拋出異常

          C.90:依靠構(gòu)造函數(shù)和賦值運(yùn)算符,而不是內(nèi)存初始化和內(nèi)存拷貝?

          容器和資源管理

          C.100:定義容器時(shí)遵從STL標(biāo)準(zhǔn)?

          C.101:賦予容器值語義?

          C102-109:容器的基本要求

          類繼承(面向?qū)ο螅?/strong>

          C.120:類層次體系只用于表現(xiàn)固有的階層結(jié)構(gòu)?

          C.121:如果基類被用來定義接口,保證它是一個(gè)純虛類?

          C.122:需要完全隔離接口和實(shí)現(xiàn)時(shí)用抽象類作為接口?

          C.126:抽象類通常不需要構(gòu)造函數(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.131: 避免無意義的getters和setters?

          C.132:不要沒有理由就將函數(shù)聲明為虛函數(shù)?

          C.133:避免保護(hù)型數(shù)據(jù)成員?

          C.134:確保所有非常量數(shù)據(jù)成員具有相同的訪問權(quán)限?

          C.135:使用多重繼承表現(xiàn)多個(gè)不同種類的接口?

          C.136:使用多重繼承表現(xiàn)“實(shí)現(xiàn)屬性”的組合

          C.137: 使用虛基類避免過于一般的基類?

          C.138:使用using為派生類生成重載函數(shù)集合?




          覺得本文有幫助?請分享給更多人。

          關(guān)注【面向?qū)ο笏伎肌枯p松學(xué)習(xí)每一天!

          面向?qū)ο箝_發(fā),面向?qū)ο笏伎迹?/p>

          瀏覽 103
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩免费| 欧美怡红院一区二区三区 | 色播丁香五月天 | 天天操天天透 | 青青草成人视频在线播放 |