Effective C++ 之 0 導讀(Introduction)

來源:互聯網
上載者:User

標籤:

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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.