鱼C论坛

 找回密码
 立即注册

憔悴心只为你

https://fishc.com.cn/?107996

C++里的传值参数和引用参数

已有 849 次阅读2012-9-26 23:34

Template<class T>

T Abc(T a,T b,T c)

{

return a+b+b*c+(a+b-c)/(a+b)+4;

}

这种形式参数的用法会增加程序的运行开销。例如,我们来考察一下函数被调用以及返回时所涉及的操作。假定a,bc是传值参数,在函数被调用时,类型T的复制构造函数把相应的实际参数分别复制到形式参数a,bc之中,以供函数使用;而在函数返回时,类型T的析构函数会被唤醒,以便释放参数a,bc

假定数据类型为用户自定义的Matrix,那么它的复制构造函数将负责其所有元素,而析构函数则负责逐个释放每个元素(假定Matrix已经定义了操作符+*/)。如果我们用具有1000个元素的Matrix座位实际参数来调用函数Abc,那么复制三个实际参数给a,bc将需要3000次操作。当函数Abc返回时,其析构函数又需要花费额外的3000次操作来释放a,bc

Template<class T>

T Abc(T &a,T &b,T &c)

{

return a+b+b*c+(a+b-c)/(a+b)+4;

}

在上面的代码中,a,bc是引用参数(reference parameter)。如果用语句Abc(x,y,z)来调用函数Abc,其中x,y,z是相同的数据类型,那么这些实际参数将被分别赋予名称a,bc,因此,在函数Abc执行期间,x,yz被用来替换对应的a,bc。与传值参数的情况不同,在函数被调用时,本程序并没有复制实际参数的值,在函数返回时也没有调用析构函数。

常量引用参数:

Template<class T>

T Abc(const T &a,const T &b,cosnt T &c)

{

return a+b+b*c+(a+b-c)/(a+b)+4;

}

使用关键字const来指明函数不可以修改。

一种更通用的版本:

Template<class Ta,class Tb,class Tc>

Ta Abc(cosnt Ta &a,cosnt Tb &b,cosnt Tc &c)

{

return a+b+b*c+(a+b-c)/(a+b)+4;

}

在这个版本里每个形式参数可能属于不同的数据类型,函数返回值的类型与第一个参数的类型相同。


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-30 18:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部