effective c++ (一)

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

C++是一種多重範型編程語言,一個同時支持過程(procedural),面向對象(object-oriented),函數形式(functional),泛型形式(generic),元編程(metaprogramming)的語言算法

一、c part of  C++,c++時以c爲基礎發展起來的,徹底兼容於c語言編程

二、object-oriented C++,面向對象的封裝、繼承、多態等三大特性,C++都可以很好支持數組

三、template C++,使得C++支持泛型編程編程語言

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

 

注意:函數

因爲C++存在以上四種多重範型編程,故使用時注意不一樣語言層次,進行高效編程的原則也會存在差別工具

 

條款02:儘可能以const、enum、inline替換#definethis

該條款從宏觀工具來講也能夠爲:儘可能用編譯器代替預處理器spa

一、對於引用接口頭文件中的宏,在編譯時如果異常,使用者很難追蹤到問題源頭;因宏直接被替換,到編譯時候,其名稱只存在於預編譯階段,而不會進入編譯階段的的符號表中;

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

三、const支持變量限定做用域,而#define則老是全局有效

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

class GamePlayer

{

private:

  static const int NumTurns = 5;

  int Scores[NumTurns];

}

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

class GamePlayer

{

private:

  enum { NumTurns = 5 };

  int Scores[NumTurns];

};

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

總結:

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

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

 

條款03:儘量使用const

一、若是const出如今*左側,則表示指針所指物爲常量,若const出如今*右側,則表示指針本省爲常量

二、在一個函數聲明式中,const能夠和函數返回值、個個參數、函數自身(若爲成員函數)產生關聯,

若將返回值申明爲const則能夠避免a*b = c 相似的錯誤

若將不改變的變量聲明爲const 能夠避免if(a = 0)相似的錯誤

三、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];
} 

四、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

 

注意:

一、若是函數得返回類型是個內置類型,那麼改動函數得返回值歷來就是不合法得

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

三、編譯器強制實施bitwise constness

相關文章
相關標籤/搜索