我们知道,如果pass by value,那么会发生实参复制一份给形参,然后函数的任何操作都是针对形参的,不会影响实参的值。但是如果实参是一个结构体,或者一个类,那么复制的代价就太大了,因为类的复制需要调用类的复制构造函数(如果是派生类还要调用基类的复制构造函数等等)。在C语言中,我们通常都会选择传递一个指向结构体的指针而不是传递结构体的对象本身。在C++中,我们可以通过引用的方式来处理实参到形参的传递;又因为,原函数中形参的变化不影响实参,或许我们只是需要对实参做一些简单的运算然后返回运算结果,或许是只是想检测这个参数是否是合法的,总之,我们并没有修改实参的打算,那么我们应该把这个引用设定为const引用。
下面是测试代码:
当然,这取决于想实现的功能。
注意,在很多编译器中,引用是通过指针实现的,所以,对于内置类型、STL库,pass by value效率会更高一些。
总之,除了内置类型和STL库,我们更希望使用pass by reference to const,它不仅效率更高,而且不会出现切割问题。
除了大大降低传递效率之外,还有将参数设为pass by reference 还有一个好处就是防止“对象切割”的发生:当一个派生类按值传递给一个基类形参时,基类的构造函数会被调用,而派生类自己的“个性”全都没有了;而传递引用则会保留派生类的“个性”:
class Base
{
public:
virtual void fun(){cout<<"base"<<endl;}
};
class Drived:public Base
{
public:
void fun(){cout<<"derived"<<endl;}
};
void fun(Base b)
{
b.fun();
}
void fun1(Base &b)
{
b.fun();
}
下面是测试代码:
Drived d1;
fun(d1);//打印为base
fun1(d1);//打印为drived
当然,这取决于想实现的功能。
注意,在很多编译器中,引用是通过指针实现的,所以,对于内置类型、STL库,pass by value效率会更高一些。
总之,除了内置类型和STL库,我们更希望使用pass by reference to const,它不仅效率更高,而且不会出现切割问题。