effective c++ (一)

來源:互聯網
上載者:User

標籤:indicator   支援   .com   com   cat   自身   length   lock   const成員函數   

條款01:把C++看作一個語言聯邦

C++是一種多重範型程式設計語言,一個同時支援過程(procedural),物件導向(object-oriented),函數形式(functional),泛型形式(generic),元編程(metaprogramming)的語言

1、c part of  C++,c++時以c為基礎發展起來的,完全相容於c語言

2、object-oriented C++,物件導向的封裝、繼承、多態等三大特性,C++都能夠很好支援

3、template C++,使得C++支援泛型程式設計

4、STL,STL是個標準模板庫,它對容器,迭代器,演算法,函數對象等進行了封裝,使得使用者能夠直接調用

 

注意:

由於C++存在以上四種多重範型編程,故使用時注意不同語言層次,進行高效編程的原則也會存在差異

 

條款02:盡量以const、enum、inline替換#define

該條款從宏觀工具來說也可以為:盡量用編譯器代替前置處理器

1、對於引用介面標頭檔中的宏,在編譯時間若是異常,使用者很難追蹤到問題源頭;因宏直接被替換,到編譯時間候,其名稱只存在於先行編譯階段,而不會進入編譯階段的的符號表中;

2、const常量能夠比#define產生更輕量的代碼,因#define定義的變數在替換時候會產生多個副本,而const則不會

3、const支援變數限定範圍,而#define則總是全域有效

4、對於class專屬常量,對於有的編譯器,其定義域聲明同普通成員變數的聲明一致,且可以同事給予賦值;對於有的編譯器則不行,必須按照函數定義的形式給以賦值;如果變數的值必須在聲明時要求給定(如該變數將作為類成員變數數群組成員的大小)

class GamePlayer

{

private:

  static const int NumTurns = 5;

  int Scores[NumTurns];

}

若編譯器不允許聲明時給NumTurns賦值,則可藉助枚舉進行規避,

class GamePlayer

{

private:

  enum { NumTurns = 5 };

  int Scores[NumTurns];

};

此處的枚舉變數與常量的區別在於:常量可以取地址,而枚舉變數不能夠取地址

總結:

1、對於單純變數,最好以const對象或enums替換#defines

2、對於形似函數的宏(宏函數),最好改用inline函數替換#defines

 

條款03:儘可能使用const

1、如果const出現在*左側,則表示指標所指物為常量,若const出現在*右側,則表示指標本省為常量

2、在一個函式宣告式中,const可以和函數傳回值、個個參數、函數自身(若為成員函數)產生關聯,

若將傳回值申明為const則可以避免a*b = c 類似的錯誤

若將不改變的變數聲明為const 可以避免if(a = 0)類似的錯誤

3、const成員函數的優點:

  a、它使得成員函數更容易被理解,很容易得知哪個函數可以改動對象內容而哪個函數不可以

  b、它們是操作“const 對象”成為可能,是pass by reference to const方式傳遞對象得技術前提

  c、兩個成員函數如果只是常量性不同,可以被重載

class TextBlock{public:     const char&  operator[](std::size_t position) const    { return text[position];}    char& operator[](std::size_t position)    { return text[position]; }private:    std::string text;  }TextBlock tb("Hello");std::cout << tb[0];  //調用非const operator[]const TextBlock ctb("Hello")std::cout << ctb[0]   //調用const operator[]void print(const TextBlock& ctb){    std::cout << ctb[0];} 

4、bitwise constness 和 logical constness

  a、bitwise通過檢查函數內有無賦值操作來判定;為了保證bitwise的常量性,不允許在const函數中存在為non-static成員變數賦值得操作,為了破除這種限制,需要在non-static變數申請時,添加mutable關鍵字 mutable std::size_t textLength;

  b、在const與非const函數的聲明中造成了代碼的高度重複

  c、const_cast<type>(xxx)能夠去除xxx變數的const屬性;static_cast<const type>(xxx)能夠為xxx變數加上const屬性

  d、必須使用非const函數中調用const函數的方式,因使用const中調用非const將破壞const函數的 bitwise constness

 

class TextBlock{public:     const char&  operator[](std::size_t position) const    {         ...         ...         ...              return text[position];    }    char& operator[](std::size_t position)    {                return const_cast<char&>(      //將op[]傳回值的const去除                    static_cast<const TextBlock&>(*this)  //為*this加上const                   [position]   //調用op[]                   );     }private:    std::string text;  }    
View Code

 

注意:

1、如果函數得傳回型別是個內建類型,那麼改動函數得傳回值從來就是不合法得

2、將某些東西聲明為const,有利於編譯器偵測出錯誤

3、編譯器強制實施bitwise constness

 

effective c++ (一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.