value parameters VS reference parameters

  忽然想起先前看过的一个知识点,值传递和引用传递。相信大家对此都不会陌生,当不改变参数的值的时候使用值传递,需要改变参数的值的时候使用引用传递,其实这只是其中的一方面。先看下面一个小程序:

template <class T>
T Sum(T a, T b, Tc){
     return a+b+c;
}

  当执行sum(x,y,z)时,首先编译器会决定形参的data type,假如x,y,z都为int类型,则编译器会用int来替代T,然后将实参x,y,z分别复制到临时变量a,b,c中,此时会调用int类型的copy constructor,当函数调用结束时,会调用int类型的destructor。对于int类型,这可能开销可以忽略不计,然而,设想一下,如果传入的实参是一个用户自定义的metric类型,100*100,有10000个元素,则会调用30000词拷贝构造函数和30000次析构函数!

  再看下面使用应用传递的程序:

template <class T>
T Sum(T& a, T& b, T&c){
     return a+b+c;
}

  当执行sum(x,y,z)时,由于是使用引用传递,此时,a,b,c就相当于是x,y,z的别名,所以,此时并不会调用copy constructor ,当然当程序结束时,也不会调用destructor,这样我们就省了60000次操作!
  

  所以,适当的使用值传递和引用传递有时会极大的提高效率,我们平时要养成好习惯。还有,如果形参的值,我们确定是不改变的,则可以使用关键字:const,如下:

template <class T>
T Sum(const T& a, const T& b, const T&c){
     return a+b+c;
}

  反正上面的程序尽管只有4行,实现的功能也是so easy,但是如果有一个人写出这样的程序,我的第一印象就是他很专业,很规范,所以大家要学会规范书写,上来就给人留下好的印象。如果当初复试的时候,我能把简单的二分查找,按如此格式书写,可能我就入赘大CAD了……惨剧

  最后,总结一下,当函数不改变参数的值的时候:对于简单数据类型,比如int,float,char我们只需用值传递即可,对于其他复杂的类型,我们使用const reference parameters。需要改变形参的值得时候,使用引用传递即可。

 

转载于:https://www.cnblogs.com/Thunderstorms/p/3459311.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值