函数与参数
1.传值
int sum(int a,int b)
{
return a+b;
}
int main()
{
sum(2,3);
return 0;
}
上述程序中a,b称为形式参数。在调用此函数时,“传值形式参数相对应的实际参数的值将在该函数执行之前被复制给形式参数,复制过程是由该形式参数所属的数据类型的复制构造函数完成的。”这是在《数据结构、算法与应用——C++语言描述》中看到的,也就是说在调用sum这个函数的时候,int类型的复制构造函数会把2复制给a,把3复制给b。并且当函数运行结束的时候,会调用int类型的析构函数释放掉该形式参数所占用的内存空间。在函数返回时,形式参数的值是不会传递给实际参数的,从另一方面讲形参不会改变实参的值。
2.传引用
int sum(int &a,int &b)
{
return a+b;
}
int main()
{
sum(2,3);
return 0;
}
这部分的代码片段与上面的代码片段的最大的区别在于,这里函数传递参数的方式发生了改变,用的是传递引用的方式。直接传值的方式会增加程序的运行开销。以1中的程序为例,如果传入的参数并非只是单个int类型的值,如果传递的是vector,并且存储很多的数据,那么在进行函数调用的时候,需要复制构造函数和析构函数——先将值复制给形参,然后等该函数调用完毕后,再一一释放掉。当数据量很大的时候,有多少的数据就要调用多少次的复制构造函数和析构函数,这样做会明显增加程序的运行时间。
所以一般数据多的时候会使用引用参数的形式来进行传参。引用传参的实际过程是,直接把实际参数替换掉形式参数。该过程不会调用相应的构造函数和析构函数。
3.函数返回值
int &sum(int &a,int &b)
{
return a+b;
}
函数可以返回值、引用、常量引用。在1和2中,被返回的对象均被复制到调用的环境中。当调用sum函数并计算出结果后,会被储存在一个临时变量里,当函数返回后,该临时变量,包括其他的临时变量和形式参数所占用的空间将会被全部释放掉,所以为了避免丢失这个值,在释放掉临时变量以及形参之前,必须把该临时变量复制到调用该函数的环境中。
但是如果返回的是一个引用( 或者常量引用),不会把把返回的引用复制到返回的环境中。