c++形参实参实参和形参,很抽象的一个概念,新手很难搞懂。
形参:全称为"形式参数"是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数.
形参的作用是实现主调函数与被调函数之间的联系.
实参:全称为"实际参数"是在调用时传递该函数的参数.实参可以是常量、变量、表达式、函数等.
先说C语言:
只要知道了按值传递和按地址传递的区别,就会明白实参和形参的具体工作细节。
1)按值传递(不能改变实参)
实参是变量,表达式等数值。
函数调用的时候,实参和形参存在于内存中2快不同的区域,实参先自己复制一份拷贝,再把拷贝传给形参。由于是传递的是拷贝,所以实参不会受形参的影响,实参值不会被改变。
2)按地址传递(可以改变实参)
实参是指针。
函数调用的时候,指针传给你,形参和实参指针都一样,对形参的任何操作就等于对实参的操做。实参的值就可以被改变。
再说C++:
C++有引用来代替指针这种落后的类型。
1)const引用传递(不能改变实参)
和上面的C中按值传递的效果一样,但是效率高一些,因为引用是不用拷贝实参的,减少了复制的开销。const就决定了不能改变实参。
2)按引用传递(可以改变实参)
引用其实大部分情况下和指针一样,对形参的任何操作就等于对实参的操做。实参的值就可以被改变。要不变,就学上面加个const。
实际应用中,形参有3种用法:
1)f(int X) 这C语言的用法,实参是数值,就不变;实参是指针,就可以改变。
2)f(int& X) C++的用法,实参可以改变。
3)f(const int& X)C++的用法,实参不变。
什么时候用哪一种呢?就是取决于是否改变实参!!!
建议用C++的用法,虽然C++兼容C。
注意:形参和实参的类型必须要一致,或者要符合隐含转换规则,当形参和实参不是指针或引用类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的内容复制一份,在该函数运行结束的时候形参被释放,而实参内容不会改变。
而如果函数的参数是指针或引用型类型变量,在调用该函数的过程中,传个函数的是实参的地址,在函数体内部使用的也是实参的地址,即使用的就是实参本身。所以在函数体内部可以改变实参的值。
对于一般类型的实参,在程序运行完后其值不变,而对于引用或者指针类型的实参,由于用的是它本身的地址,所以程序运行完后它们的值改变了。
注意比较(1)函数申明、(2)函数调用、(3)函数定义 的不同。
申明:
(1) int swap(int a,int b); //子函数swap的参数为传值使用,使用的原始数据不会被子函数swap修改
(2) int pswap(int &c,int &d);//子函数pswap的参数为传地址使用(引用),引用的原始数据能被子函数pawap修改
//函数申明 格式: 是否返回值int/void 函数名pswap(参数的数值类型int 引用&/传值 形式参量的名称c,…)在这里形参的名称可有可无
调用:
swap(x,y); //主函数里子函数调用的格式: 子函数名(实参1,实参2,…),这里函数名前面不加int、void,实参前面不写数值类型
pswap(p,q); //在这里 x、y、p、q是实际参数