欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

《Effective C++》閱讀總結(四): 設計、聲明與實現(xiàn)

第四章: 設計與聲明

18. 讓接口更容易被正確使用,不易被誤用

  • 將你的class的public接口設計的符合class所扮演的角色,必要時不僅對傳參類型限制,還對傳參的值域進一步限制。

19. 設計class猶如設計type

  • 內(nèi)置類型如int、float等,本質也是一個class,用戶自定義的class的行為和狀態(tài)應當與內(nèi)置類型類似的。設計class時,首先要考慮構造和析構、然后是賦值操作如何實現(xiàn)、考慮class是否要繼承某一已有class、盡量使你的class一般化等等需要考慮的問題。

20. 寧以pass-by-reference-to-const替代pass-by-value

  • 這個準則很常見,使用const引用傳參以避免拷貝和修改入?yún)?。看具體場景,如果是需要修改入?yún)?,那么就不要加const、如果入?yún)⑹呛唵蝺?nèi)置類型,拷貝不怎么消耗資源,那么直接傳值也是可以的。同樣,使用指針也是一樣的道理。此外,傳class的引用或指針也可以避免對象切個問題,例如函數(shù)接受一個父類對象,當傳入子類對象時,父類對象構造函數(shù)會被調用,此時子類的屬性就會丟失,即切割問題,這是不希望的。

21. 必須返回對象時,不要妄想返回reference

  • 很顯然的一點就是,你不能返回一個locakl對象的指針或者引用,因為,函數(shù)調用結束后,所有存儲在棧上的local對象都將被銷毀。此外,可以返回在函數(shù)內(nèi)構造的堆對象的指針,但盡量不要返回其引用,引用如果在返回后沒有保護好而被覆蓋,則造成內(nèi)存泄漏。

22. 將成員變量聲明為private

  • 這是一個封裝合理的class應當遵守的規(guī)則,成員變量聲明為private的話,可以通過public接口間接控制成員變量,并加以特殊限制。這樣做也有缺點,就是編寫代碼無法直接修改成員變量,代碼量增加。如果只需要保存讀取數(shù)據(jù),不做其他操作,那么聲明一個結構體是一個不錯的選擇。
    我們一把不使用protected成員,沒什么用。

23. 寧以non-member、non-friend替換member函數(shù)

  • 如果一個操作是一般性的,并不是class特有的,那么將其抽離class單獨聲明定義。

24. 若所有參數(shù)都需要類型轉換,請為此采用non-member函數(shù)

  • 這里的所有參數(shù)包括this指針,所以連this指針都需要轉換類型,那么這個函數(shù)其實就不應該是這個class的成員函數(shù),應當抽離class。

25. 考慮寫一個不拋出異常的swap函數(shù)

  • 使用std::swap吧,我覺得目前夠用了

第五章 實現(xiàn)

我們寫c++代碼,一個是如何設計架構,即定義class及其成員函數(shù)和成員數(shù)據(jù),以及不同class之間的通訊關系;另一個是如何具體實現(xiàn)每個函數(shù),對每個函數(shù)或成員函數(shù)的功能進行實現(xiàn),這部分每個功能相對獨立,比較底層,但其中也有些需要注意的點,主要有以下幾個:

我們提供的服務有:成都做網(wǎng)站、成都網(wǎng)站設計、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、九江ssl等。為數(shù)千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的九江網(wǎng)站制作公司

26. 盡可能延后變量定義式的出現(xiàn)時間

  • 這樣可以提高程序的效率,但我并不認為會提高程序的可讀性。對于那些不是非常在意運行效率的函數(shù),可讀可維護性要排在效率前面,如初始化,而那些會循環(huán)調用很多次的代碼,如模型推理計算,效率至上。此外,編譯器也會盡可能優(yōu)化代碼,以提高運行時效率。

27. 盡量少做轉型動作

C++中的cast方法有四種:
const_cast:用于移除對象身上的const屬性,只此一個功能。常用。低風險。
static_cast:用于強制隱式轉換。例如將int轉為double,將基類指針轉為子類指針時不進行安全檢查。不可用于移除const屬性。常用。低風險。
dynamic_cast:用于執(zhí)行類繼承體系中安全向下轉型。也就是用來決定某個對象是否歸屬類繼承體系中的某個類型。比如可以將多態(tài)基類(包含虛函數(shù)的基類)的指針強制轉換為派生類的指針,很耗時,不常用。高風險。
reinterpret_cast:用于執(zhí)行低級轉型,例如將int*轉為int,執(zhí)行的是逐個比特復制的操作。 不用。高風險。

  • 所以,首先盡量避免轉型,或者對于不可避免的轉型,將轉型操作隱藏到函數(shù)里面,并且盡量使用C++style的轉型方法,不要使用早期C風格的那種方法。在類繼承體系中進行上行轉換時,dynamic_caststatic_cast效果一樣且安全,但下行轉換時,dynamic_cast會進行類型安全檢查且耗時,而static_cast不進行檢查。所以如果有必要且明確基類指針是哪個子類時,通常使用static_cast即可。
    移除const屬性是危險的,如無十分必要請不要這樣做,肯定有其他方法規(guī)避這種危險操作。

28. 避免返回handle指向對象的內(nèi)部成分

  • 即不要返回指向對象數(shù)據(jù)成員的指針或引用,以保證對象的封裝性,防止外部改變對象內(nèi)部數(shù)據(jù)。如果非要這樣做,請將返回值加上const屬性,以禁止修改。

29. 為異常安全所做的努力是值得的

  • 這條準則不好總結,大概來說就是對那些可能導致異常發(fā)生的函數(shù)進行異常捕獲并進行適當?shù)奶幚?,以避免?nèi)存泄漏。

30. 透徹了解inline的里里外外

  • 直接定義在class體內(nèi)的成員函數(shù)默認是內(nèi)聯(lián)的,也可以在class體外顯式聲明內(nèi)聯(lián)函數(shù),但最終是否執(zhí)行內(nèi)聯(lián)替換由編譯器決定,它只會將那些小型、頻繁調用的函數(shù)編譯為內(nèi)聯(lián)函數(shù),這樣能盡可能降低代碼膨脹并提升程序執(zhí)行速度。

31. 將文件間的編譯依存關系降至最低

  • 即讓代碼依賴聲明式而非定義式,這樣定義式發(fā)生改變不會導致依賴于該定義式的其他代碼也需要重新編譯?;诖藰嬒氲膬煞N方案是:Handle classinterface class。這是在我們平時構建工程的時候經(jīng)常遇到的兩種設計方法。
  • 程序庫頭文件應該以“完全且僅有聲明式”的形式存在。其他代碼依賴此文件即可。

小結:

以上即總結。明天上班。

網(wǎng)頁標題:《Effective C++》閱讀總結(四): 設計、聲明與實現(xiàn)
當前網(wǎng)址:http://chinadenli.net/article48/dsoijhp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設、用戶體驗網(wǎng)站設計公司、小程序開發(fā)、企業(yè)網(wǎng)站制作App設計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作