C++函数
函数的参数传递方式:按值传递、按地址传递、按引用传递
值传递最简单,是一种单向的参数传递方式,也就是说传递过程中产生一个副本,只把实参的值传递给形参,传递完成以后副本的工作也就结束了,实参不再与形参有联系,进入函数体后整个函数生命周期内只有形参在起作用。形参在函数内的变化不会影响实参,实参的值在函数调用后不会发生改变。
如果希望被调函数改变主调函数中实参的值,可以采用按地址传递或按引用传递方式。
按地址传递时,函数定义时以指针作为函数的形参,函数调用的实参必须是指针变量或者变量的地址:
定义: void func( string *p )
调用: string str; ... func( &str );
按引用传递:
void swap( int &a, int &b);
调用 swap( val1, val2);
交换后实参val1和val2都改变了。
a 是 val1的别名,b是val2的别名,对a, b的操作就是对val1和val2的操作。
使用引用传递参数没有在内存中产生实参的副本,不需要将实参拷贝给形参。因此当参数传递的数据较大,引用传递比值传递在空间和时间上效率都更高。使用指针进行地址传递也可以改变实参,但是同样要给形参分配额外的内存单元,把地址赋值给指针变量的运算。
const引用形参能够保证参数在函数中不被修改,既保证了数据的安全,又改善了运行效率。实际上使用非常量引用作为形参,会不必要地限制传入实参的类型(必须为非const对象)。
C++ 默认参数值
函数有多个形参,带默认值的形参必须放在参数表的右部,也就是带默认值的参数右边不能有不带默认值的形参。
在函数调用时,如果省略某个实参,那么该实参右边的所有实参都必须省略。
void fun1( int, int = 1, int = 1, int = 1)
...
func1(10, , 5); // 错误
fun1(10, 1, 5); // 正确