[GeekBand ] 利用 pass by reference -to -const 編寫高效規範的 c++代碼

   

本文參考資料 :  GeekBand 侯捷老師,學習筆記程序員

                       Effective C ++ 侯捷譯 條款20函數

                       開發環境採用:VS2013版本學習

 

 

首先:分析值傳遞的缺點 (一)

class Person{
public:
    Person();
    virtual ~Person();
private:
    std::string name;
    std::stringi address;
};

class Student: public Persion{
public:
    Student();
    ~Student();
private:
    std::string schoolName;
    std::string schoolAddress;
};

  函數調用部分:spa

bool validateStudent(Student s);
Student plato;
bool platoIsOk = validateStudent(plato);

  

經過以上代碼,分析得:對象

一、基類Student的構造函數調用,以plato 爲藍本爲s初始化;結束時調用一次析構函數。blog

     基類Student中有兩個String對象,此時又有兩次構造函數和析構函數。繼承

     基類Student共有三次構造、三次析構開發

二、每次構造Student對象必須構造一次Person對象。由於Student繼承自Person對象。string

     同理,Person也有三次構造、三次析構。it

推論:這種按值傳參的方式,效率有點低啊。同時若是採用按引用傳遞,那麼沒有任何構造函數或析構函數被調用,由於沒有任何對象被建立

 

而後:分析值傳遞的缺點 (二)

Class Window
{

public:
std::string name() const;
virtual void display() const;    
}
Class WindowWithScrollBars:public Window
{

public:
virtual void display() const; 

}

  

觀察代碼得知:

     一、子類WindowWithScrollBars繼承自基類Windows

     二、基類、子類中均有函數 display,這裏簡單的把基類的display記爲,dispaly_1.子類的記錄爲,display_2

 

void printNaAndDisplay(Window w)
{

std::cout<<w.name();
w.display();

}

  

而此時

WindowWithScrollBars wwsb;
printNameAndDisplay(wwsb);

  這時建立了子類對象wwsb,看上去應該調用子類的dispay_2纔對,而實際上由於void printNameAndDisplay(Window w),是按值傳遞的。

不管傳遞過來的數值是什麼,誇張點的、好比整形、字符型等等。都會自動的轉換爲Window類型,由於傳遞過來的僅僅是數值!!!

因此,這裏調用的是基類的display,因此此程序沒法知足程序員最開始的設想!

 

解決這個問題,一樣採用引用傳遞便可!

傳進來是什麼類型,w就是那種類型

3、再說說,爲何採用const這個參數進行限定

按引用傳遞後,在函數內部會改變傳過來的數值。而改動函數的返回值歷來就不是合法的。因此咱們加個限定詞 const,這樣就解決這個問題了。

相關文章
相關標籤/搜索