条款20:宁以pass by refrence to const 替换 pass by value

我们知道,如果pass by value,那么会发生实参复制一份给形参,然后函数的任何操作都是针对形参的,不会影响实参的值。但是如果实参是一个结构体,或者一个类,那么复制的代价就太大了,因为类的复制需要调用类的复制构造函数(如果是派生类还要调用基类的复制构造函数等等)。在C语言中,我们通常都会选择传递一个指向结构体的指针而不是传递结构体的对象本身。在C++中,我们可以通过引用的方式来处理实参到形参的传递;又因为,原函数中形参的变化不影响实参,或许我们只是需要对实参做一些简单的运算然后返回运算结果,或许是只是想检测这个参数是否是合法的,总之,我们并没有修改实参的打算,那么我们应该把这个引用设定为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,它不仅效率更高,而且不会出现切割问题。 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值