c++基础学习之函数与参数

1.传值参数

//传值参数
int Abc(int a,int b,int c)
{
    return a+b+b*c+(a+b-c)/(a+b)+4;
}

a,b和c是函数Abc 的形式参数formal parameter,类型均为整型。如果在如下语句中调用函数A b c:

z = Abc(2,x,y)

那么,2,x 和y 分别是对应于a,b 和c 的实际参数(actual parameter)。

当A bc ( 2 ,x ,y) 被执行时,a 被赋值为2;b 被赋值为x;c 被赋值为y。如果x 和 / 或y 不是int 类型,那么在把它们的值赋给b 和c 之前,将首先对它们进行类型转换。在上面程序中,形式参数a,b 和c 都是传值参数(value parameter)。

运行时,与传值形式参数相对应的实际参数的值将在函数执行之前被复制给形式参数,复制过程是由该形式参数所属数据类型的复制构造函数(copy constructor)完成的。如果实际参数与形式参数的数据类型不同,必须进行类型转换,从实际参数的类型转换为形式参数的类型,当然,假定这样的类型转换是允许的。
当函数运行结束时,形式参数所属数据类型的析构函数(destructor)负责释放该形式参数。当一个函数返回时,形式参数的值不会被复制到对应的实际参数中。因此,函数调用不会修改实际参数的值。

2.模板函数

//模板函数
template<class T>
T Abc(T a, T b, T c)
{
    return a+b+b*c+(a+b-c)/(a+b)+4;
}

利用这段通用代码,通过把T替换为int,编译器可以立即构造出程序计算整形,把T 替换为float又可以立即构造出程序处理浮点型。事实上,通过把 T替换为double或long,编译器又可以构造出函数Abc的双精度型版本和长整型版本。把函数 Abc 编写成模板函数可以让我们不必了解形式参数的数据类型。

3.引用参数

形式参数的用法会增加程序的运行开销。

考察一下函数被调用以及返回时所涉及的操作。假定 a,b 和c 是传值参数,在函数被调用时,类型 T 的复制构造函数把相应的实际参数分别复制到形式参数 a,b 和c 之中,以供函数使用;而在函数返回时,类型T的析构函数会被唤醒,以便释放形式参数 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;
}

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

4.常量引用参数

这种模式指出函数不得修改引用参数。

//常量引用参数
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;
}

使用关键字const 来指明函数不可以修改引用参数的值,这在软件工程方面具有重要的意义。这将立即告诉用户该函数并不会修改实际参数。

原文地址:https://www.cnblogs.com/lingc/p/3379322.html