《Effective C++》条款20、尽量用const &替换值传递

const &能避免拷贝的开销

在c++的参数传递过程中,有两种传值方式,一种是我们将会传递值,另一种则是我们将会传递一个const 参数引用。
这两种方式有本质的区别,我们更推荐传递常量引用的方式进行参数传递。考虑从以下代码:
在这里插入图片描述
现在我们有个函数会把Student作为参数传入没然后判断该学生信息是否合法。
在这里插入图片描述
如果我们采用以上的方式进行值传递,那么我们在函数的局部作用域内就会为我们传入的Student对象做一个值得拷贝,也就是调用Student的拷贝构造函数对其进行拷贝,然后离开函数的局部作用域后将会调用该对象的析构函数进行析构。然而Student类中包含了两个string对象,而且他还继承了Person类,Person类中又包含了两个string对象,因此,当我们每拷贝一次机会拷贝四个strin对象,所以这将导致我们进行参数传递时花费大量的时间去进行对象的拷贝。

所以为了避免这些不必要的拷贝,我们采用引用的方式进行参数传递。
在这里插入图片描述
用这种方式的传递,将不会进行值得拷贝,也不会又拷贝构造函数和析构函数的调用。

const & 能防止对象被切割

用引用传递参数还能避免对象被切割的问题,如果我们采用值传递方式是进行参数传递,我们不能将一个Studentd的对象传递给一个接受Person对象的函数,因为这样的值传递将会导致强制类型转换,我们传入的Student对象将会被强制的转换为Person对象,从而Student对象多特有的类将会被切割掉,但是如果我们用的时const & 的方式进行参数传递则不会发生对象被切割的问题,因为引用的实质也是和内存地址打交道,其实实质用指针实现,传递引用相当于传递的是之指针。

一个图形的窗口:
在这里插入图片描述
如果你写个函数希望打印窗口的名字:
在这里插入图片描述

但是我们传递给的参数为Window的子类,则会导致子类转换成Window类对象。
在这里插入图片描述
所以我们需要将其改为用const &的方式上进行参数传递:
在这里插入图片描述
所以我们进行参数传递时,应该尽量的采用const &的方式进行值传递。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值