本文參考資料 : 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,這樣就解決這個問題了。