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