01. More Effecitve C++ (譯序,導讀,基礎議題)-- 學習筆記

01. More Effecitve C++( 譯序,導讀,基礎議題)

作者 : Scott Meyers

1. 譯序

c++提供了四種不同(但相輔相成)的程式設計思維模式:procedural-based,object-based,object-oriented,generic paradigm。
動力是: 一旦學成,妙用無窮。

相關書籍

廣博如四庫全書者:The C++Programming Language、C++ Primer
深奧如重山覆水者:The Annotated C++ Reference Manual, Inside the C++ Object Model
細說歷史者:The Design and Evolution of C++, Ruminations on C++
獨沽一味者:Polymorphism in C++, Genericity in C++
獨樹一幟者:Design Patterns,Large Scale C++ Software Design, C++ FAQs
程式庫大全:The C++ Standard Library
另闢蹊徑者:Generic Programming and the STL
工程經驗之累積:Effective C++, More Effective C++, Exceptional C++

2. 導讀

涵蓋 C 函式庫
不必犧牲移植性
不必從頭撰寫常用演算法和資料結構
C++ 編譯器的數量不斷增加
C++ 開發工具和開發環境愈來愈豐富,威力愈來愈強大,穩健強固(robust)的程度愈來愈高。

本書回答的問題

  • 我如何能夠設計出適應未來需求的軟體?
  • 我如何能夠改善程式碼的效率而不折損正確性和易用性?
  • 我如何能夠實作出語言未能直接支援的精巧機能?
    本書告訴你如何更具實效地設計並實作 C++ 軟體:讓它行爲更正確;面對異常情況時
    更穩健強固;更有效率;更具移植性;將語言特性發揮得更好;更優雅地調整適應;在「混
    合語言」開發環境中運作更好;更容易被正確運用;更不容易被誤用。簡單地說就是如何讓
    軟體更好。

大部份 C++ 教科書中對語言性質的大量描述,只能算是本書的一個背景資訊而已。
你應該在閱讀本書之前便熟悉 C++。我假設你已瞭解類別
(classes)、保護層級(protection levels)、虛擬函式、非虛擬函式,我也假設你已通曉
templates 和 exceptions 背後的概念。

2.1 本書所談的 C++

ISO/ANSI 標準委員會於 1997 年 11 月完成的 C++國際標準最後草案(Final Draft International Standard)。

2.2 慣例與術語

inheritance(繼承),意思是 public inheritance
繼承箭頭畫法:從 derived classes 畫往 base classes,
抽象類別:abstract classes,
具象類別:concrete classes

Inheritance(繼承機制)會引發「pointers(或 references)擁有兩個不同類型」的
議題,兩個型別分別是靜態類型(static type)和動態類型(dynamic type)。Pointer 或
reference 的「靜態類型」是指其聲明時的類型,「動態類型」則由它們實際所指的物件來
決定。

一種命名方式爲 pointer 和 reference 命名。

  • pgo:pointer-to-GameObject;
  • pa:pointer-to-Asteroid;
  • rgo: reference-to-GameObject。

兩個參數名稱:

  • lhs:“left-hand side”
  • rhs:“right-hand side”

其他縮寫:
ctor : “constructor”,
dtor : “destructor”
RTTI : C++ 對 runtime type identification 的支援

爲了強調在 C++ 中 memory leaks 往往也會遺失其他資源,我在書中
常以 resource leaks 一詞取代 memory leaks。

對象用完後一直未被釋放時,對象所佔的內存,以及構造對象時分配的其他資源
(如 file descriptors, semaphores, window handles,database locks),一起被遺失。

inline 函式:

  • 決定一個函式是否應被 inlined,條件十分複雜、敏感、而且與平臺有關。
  • 避免 inlining,除非其中有個關鍵點非使用 inlining 不可。

client:指你所寫的程式碼的客戶。

  • 或許是某些人(程式員),
  • 或許是某些物(classes 或 functions)

如何讓 clients 更輕鬆,通常這會導至你的行事更困難,因爲好的程序「以客爲尊」。

3. 基礎議題

  • pointers(指針)
  • references(引用)
  • casts(類型轉換)
  • arrays(數組)
  • constructors(構造)

3.1 Item M1:指針與引用的區別

指針與引用都是讓你間接引用其他對象。

在什麼時候使用指針,什麼時候使用引用?

  • 如果變量在某些時候可能不指向任何對象,應該把變量聲明爲指針,因爲這樣你可以賦空值給該變量。
  • 如果變量肯定指向一個對象,例如你的設計不允許變量爲空,可以把變量聲明爲引用。

因爲引用肯定會指向一個對象。

  • 引用指向空值,結果不確定。
  • 引用應被初始化。
  • 使用引用之前不需要測試它的合法性,使用引用的代碼效率比使用指針的要高。

指針應該總是被測試,防止其爲空。

指針可以被重新賦值以指向另一個不同的對象。
引用總是指向在初始化時被指定的對象,以後不能改變。

應該使用指針的情況:

  • 存在不指向任何對象的可能
  • 需要能夠在不同的時刻指向不同的對象

使用引用的情況:

  • 總是指向一個對象並且一旦指向一個對象後就不會改變指向
  • 重載某個操作符併爲防止不必要的語義誤解時

除此之外的其他情況下,則應使用指針。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章