C++ 函数形参与实参总结
最近大大小小的c++面试面试参加了一大堆,大多顺利通过,但有些还是被鄙视的很惨,这其中就要关于函数的技术常识,平时只是稀里糊涂的写,没做过啥总结,现在就算是还账了吧。切入正题:
1.函数:其实简单讲就是一个处理数据的相应功能体,但是它的实现过程很多人并不清楚,函数的存储与执行大多是在栈上完成的,具体的我不细说可以在网上找到。先举个例子:
void setval(int a,int b){
a=b; }
void main(){
int a=0;
a=10;//---------------------1
setval(a,22);//--------------2
}
1,2是相同的过程吗?
显然不是,c++中函数的形参在函数调用的时候,是先把参数拷贝一份副本,其实质是对副本的操作,更重要的是在函数调用完后立即销毁变量参数。
2.所以,当需要改变函数值的时候多数的处理方法是采用返回值和传址函数和函数引用,下面先看看基于指针的函数调用:
void setval(int*a,int b){
*a+=b;
}
void main(){
int a=10;
setval(&a,10); //结果为20
}
3.函数引用形参:void setval(int &a,int b){
a+=b;
}
void main(){
int a=10;
setval(&a,10); //结果为20
}
但是要注意引用的形参的任何改变都是对原数据的改变,它作为形参不会在函数的调用时,做一个拷贝操作的。但是这样的操作是有问题的:
void setval(int &a){ a+=11;}
void mian(){
int a=9;
setval(90);//错误!!!
}
这种操作其实没有弄明白引用作为形参的意义,90是个const常量,这种赋值是试图修改a,但a已经有值9了,它是一个非const类型的数据,这种类型转变是在c++编译器中不允许的,自然会报错。