在论坛中,发现有的道友对自定义函数的调用存在这以下问题:
1、自定义函数声明、函数调用、函数实现概念混淆
2、形参和实参混淆;
3、自定义函数参数的传值方式混淆;传来传去都不知道传的到底是什么?
接下来,我就重点围绕道友们常见的问题,说一说:
1、自定义函数声明、函数调用、函数实现
比如:交换两个数的值的自定义函数swap
函数声明方式: void swap(int &a,int &b);
函数实现方式:void swap(int &a,int &b) { int temp=a;a=b;b=temp}
函数调用方式:swap(a,b);
通过这个实例就可以明显看到三者之间的区别。但是要说明几点:
(1)函数调用方式里面的参数名和函数声明(实现)的参数名可以不相同,因为它只是一个名字,只需要保证他们参数的类型和参数的个数一致;
(2)函数声明和实现方式里面的参数名、参数类型、以及参数个数必须一致。
2、形参和实参混淆
形参是函数实现(声明)里面的参数,而实参是函数调用里面的参数;如:
void swap(int &a,int &b) { int temp=a;a=b;b=temp} 里面a,b是形参
swap(a,b)里面的a,b是实参
3、传值和传址方式
很多道友都知道传值是把值传进去,而传址是把数的地址传进去;
由于自定义函数在调用完成之后就会被释放,所以如果采用传值的方式,即使变量的值在自定义函数里面发生了变化,也不会把变化的值传回来,实质上不会改变变量的值。(参数的传递方式是单向的。)
而传址是把地址传进去,自定义函数是直接访问的是变量的地址,然后把该地址存储的数值改变了,所以即使自定义函数最终被释放了,变量的值还是会改变。
明白这些后,很多道友又会有新问题,就是什么时候传值、什么时候传址?其实很简单,如果你不需要改变变量的值就传值,需要改变变量的值就传址。例如:
(1)求和的自定义函数:get_sum,用传值方式,因为实现的是求和,并不需要改变a,b的值,当然你也可以用传址。
void get_sum(int a,int b){
int sum=a+b;
}
(2)交换a,b的值:swap,用传址方式,因为我要改变a,b的值;如果用传值的话,a和b的值不会交换;
void swap(int &a,int &b)
{ int temp=a;a=b;b=temp}
总的来说,可以用传值的,也可以用传址;但是必须用传址的,就不能用传值方式。
为了便于道友们向我咨询问题,特意开设了一个免费的知识星球——CaptianXue,星球提供学习、理财、生活、职场等各类文章和免费答疑!!
g)