一、函数与参数
1、传值参数:
template<class T> T Abc(T a, T b, T c) { return a+b+b*c+(a+b-c)/(a+b)+4; }
和c将需要3 0 0 0次操作。当函数A b c返回时,其析构函数又需要花费额外的 3 0 0 0次操作来释放a,b和c。
template<class T> T Abc(T& a, T& b, T& c) { return a+b+b*c+(a+b-c)/(a+b)+4; }
的情形。由于不需要把x,y 和z 的值复制给对应的形式参数,因此我们可以节省采用传值参数
进行参数复制时所需要的3 0 0 0次操作。
###(注意这里只是节省了复制构造函数的3000次操作,而没有节省析构函数的3000次操作)###
template<class T> T Abc(const T& a, const T& b, const T& c) { return a+b+b*c+(a+b-c)/(a+b)+4; }
###(为什么这样呢?)###
在这种情况下,被返回的对象均被复制到调用(或返回)环境中。对于函数 Abc 的所有版本来说这种复制过程都是必要的,因为函数所计算出的表达式的结果被存储在一个局部临时变量中,当函数返回时,这个临时变量(以及所有其他的临时变量和传值形式参数)所占用的空间将被释放,其值当然也不再有效。为了避免丢失这个值,在释放临时变量以及传值形式参数的空间之前,必须把这个值从临时变量复制到调用该函数的环境中去。
如果需要返回一个引用,可以为返回类型添加一个前缀&。如:
T& X(int i, T& z)
定义了一个函数X,它返回一个引用参数Z。可以使用下面的语句返回z:
return z;
这种返回形式不会把z 的值复制到返回环境中。当函数X返回时,传值形式参数i 以及所有局部变量所占用的空间都将被释放。由于z 是对一个实际参数的引用,因此,它不会受影响。如果在函数名之前添加关键字c o n s t,那么函数将返回一个常量引用,例如:
const T& X (int i, T& z)
除了返回的结果是一个不变化的对象之外,返回一个常量引用与返回一个引用是相同的。
原文链接: https://www.cnblogs.com/claire-study-note/archive/2013/04/19/3065505.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/85261
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!