讀書筆記:Effective C++(二)

條款20:寧以pass-by-reference-to-const替換pass-by-value

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;
};


假設有函數

bool validateStudent(Student s);
Student plato;
bool platoIsOk = validateStudent(plato);
Student的copy構造函數會被調用,以plato爲藍本將s初始化。當離開函數validateStudent時,s會被銷燬。

1.但不僅僅如此,Student被構造時,其兩個string對象也會被構造,且它繼承之Person,那麼Person會被構造,且Person中的兩個string也會被構造,因此總共有“六次構造函數和六次析構函數”

避免上述的最好方式是使用pass by referenc-to-const

2.by reference方式傳遞參數可以避免(slicing)對象分割問題。當一個dervied class對象以by value方式傳遞並被視爲一個base class對象,這樣在函數內部,就無法使用該derived class的多態性

void printName(Window w);假設現在w是一個dervied class,那麼顯然這種方式是無法在函數內部使用w的多態函數的。

對於內置類型(int),STL的迭代器,函數對象,pass by value 要比 pass by referenc效率高些。


條款21:必須返回對象時,別妄想返回其reference

因爲在函數的內部,分配的對象是stack對象,當函數返回時,該變量就會被銷燬,reference跟指針類似,如果變量已經不存在,它們也是完全沒有意義的。

因此最好的方法是,必須返回對象,即使會有構造成本和析構成本


條款22:將成員變量聲明爲private

切記將成員變量聲明爲private。這可賦予客戶訪問數據的一致性,可細微劃分訪問控制,允諾約束條件獲得保證,並提供class作者以充分的實現彈性

protected並不必public更具有封裝性,因爲proteced的改變,會應影響所有的drived class.


條款23:寧以non-member, non-friend替換member函數

條款24:

條款25:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章