標籤:
Effective C++導讀 (Introduction)
術語(terminology)
聲明式 (declaration) 是告訴編譯器某個東西的名稱和類型(type),但略去細節。以下都是聲明式:
extern int x; //對象(object)聲明式std::size_t numDigits(int number); //函數(function)聲明式class Weight; //類(class)聲明式template<typename T> //模板(template)聲明式
每個函數的聲明式揭示其簽名式(signature),也就是參數和傳回型別.一個函數的簽名等同於該函數的類型.
定義式 (definition) 的任務是提供編譯器一些聲明式所遺漏的細節。對對象而言,定義式是編譯器為此對象撥發記憶體的地點。對 function 或 function template 而言,定義式提供了代碼本體。對 class 或 class template 而言,定義式列出它們的成員:
int x; //對象的定義式std::size_t numDigits(int number) //函數的定義式{ //此函數返回其參數的數字個數 std::size_t digitsSoFar = 1; while ((number /= 10) != 0) ++digitsSoFar; return digitsSoFar;}calss Widget { //class的定義式public: Widget(); ~Widget(); ...};template<typename T> //template的定義式
初始化(Initialization)是“給予對象初值”的過程。對使用者自訂類型的對象而言,初始化由建構函式執行。
default 建構函式是一個可被調用而不帶任何實參者。這樣的建構函式要不沒有參數,要不就是每個參數都有預設值:
class A {public: A(); //default建構函式};class B {public: explicit B(int x = 0, bool b = true); //default建構函式};class C {public: explicit C(int x); //不是default建構函式};
上述的 class B 和 C 的建構函式都被聲明為 explicit,這可阻止它們被用來執行隱式類型轉換(implicit type conversions), 但它們仍可被用來進行顯示類型轉換(explicit type conversions):
void doSomething(B bObject); //函數,接受一個類型為B的對象B bObj1; //一個類型為B的對象doSomething(oObj1); //傳遞一個B給doSomething函數B bObj2(28); //根據 int 28 建立一個B,函數的 bool 參數預設為 true doSomething(28); //錯誤!doSomething應該接受一個B而非一個int,而int至B之間並沒有隱式轉換doSomething(B(28)); //使用B建構函式將int顯示轉換(也就是轉型,cast)為一個B以促成此一調用
被聲明為 explicit 的建構函式通常比其 non-explicit 兄弟更受歡迎,因為它們禁止編譯器執行非預期(往往也不被期望)的類型轉換。
copy 建構函式被用來“以同型對象初始化自我對象”,copy assignment 操作符被用來“從另一個同型對象中拷貝其值到自我對象”:
calss Widget {public: Widget(); //default 建構函式 Widget(const Widget& rhs); //copy 建構函式 Widget& operator=(const Widget& rhs); //copy assignment 操作符 ...};Widget w1; //調用 default 建構函式Widget w2(w1); //調用 copy 建構函式Widget w3 = w2; //調用 copy 建構函式 !
w1 = w2; //調用 copy assignment 操作符
區分“copy構造”和“copy賦值”:
如果一個新對象被定義,一定會有個建構函式被調用,不可能調用賦值操作。如果沒有新對象被定義,就不會有建構函式被調用,那便是賦值操作被調用。
命名習慣(Naming Conventions)
參數名 lhs (left-hand side) 和 rhs (right-hand side)用於二元操作符函數如 operator== 和 operator* 的參數名稱.對於成員函數,左側實參由 this 指標表現出來, 所以單獨使用參數名稱 rhs.
將”指向一個 T 型對象”的指標命名為pt, 意思是”pointer to T”. 如 pw = “ptr to Widget”. 而 rw 可以表示 reference to Widget.
關於線程(Threading Consideration)
TR1 和 Boost
Effective C++ 之 0 導讀(Introduction)