寧以pass-by-reference-to-const替換pass-by-value(Prefer pass-by-conference-to-const
to pass-by-value.)
pass-by-conference-to-const:
class Point
{
public:
Point( ) : xval(2), yval(2){printf("%d,%d/n", xval, yval);}
void SetXval(int i){xval = i;}
private:
int xval, yval;
};
void const_test(const Point *p)
{
p->SetXval(9);
}
Point *p = new Point();
const_test(p);
這樣會編譯出錯:
“錯誤:將 ‘const Point’ 作為 ‘void Point::SetXval(int)’
的 ‘this’ 實參時丟棄了類型限定”
也就是說,“const
Point *p”,p的成員不可以發生更改。
類似,Point 的成員函數:
void SetXval(int
i)const{xval = i;}
則也會編譯出錯,因為在SetXval函數中,this是const的。const會修飾conference。
pass-by-value:
void const_test(Point p)
{
}
Point p;
const_test(p);
這樣操作,從p到函數實參,會涉及一次copy建構函式調用。
pass-by-conference-to-const優勢:
1、
沒有任何建構函式和解構函式被調用。
2、
可以避免slicing(對象切割問題):當一個derived class以by-value的方式傳遞並被視為一個base class對象,base class的構造copy建構函式可以被調用,這樣新的對象中,derived class部分會被丟棄掉,而獲得一個base class對象。這樣調用virtual函數是,會調用base class的,而不是預期中的derived的。
3、
對於內建類型對象,STL的迭代器,函數對象,pass
by-value往往比pass-by-reference-to-const
效率高些。除此之外,其他盡量以pass-by-reference-to-const代替pass-by-value。
注意:
1、
盡量以pass-by-reference-to-const代替pass-by-value。前者通常比較高效,並可避免切割(slicing)問題。
2、
以上規則並不適用內建類型對象,STL的迭代器,函數對象。對他們而言,pass-by-value往往比較適當。