l 通過值來傳遞一個對象的具體含義是由這個對象的類的拷貝構造函數定義的。這使得傳值成爲一種非常昂貴的操作。爲避免這種潛在的昂貴的開銷,就不要通過值來傳遞對象,而要通過引用。這會非常高效,因爲沒有新的對象被創建。而且避免了“切割問題”。如下所示:
class Window
{
public:
sting name() const;
virtual void display() const;
};
class WindowWithScrollBars: public Window
{
public:
virtual void display() const;
};
void printNameAndDisplay(Window w)
{
cout << w.name();
w.display();
}
WindowWithScrollBarswwsb;
printNameAndDisplay(wwsb);
所有作爲WindowWithScrollBars對象的行爲都被“切割”掉了。當調用display時,總是Window::display被調用。解決問題的方法就是使用引用。
l 有時不能用引用來傳遞對象。(條款23)
l 引用幾乎都是通過指針來實現的,所以通過引用傳遞對象實際上是傳遞指針。因此,如果使一個很小的對象—例如int—傳值實際上會比傳引用更高效。