條款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: