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—传值实际上会比传引用更高效。