剑三明教技改:c++形参实参

来源:百度文库 编辑:中财网 时间:2024/04/29 13:20:55
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。

形参全称为"形式参数"是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数.
形参的作用是实现主调函数与被调函数之间的联系.

实参全称为"实际参数"是在调用时传递该函数的参数.实参可以是常量、变量、表达式、函数等.


形参和实参的类型必须要一致,或者要符合隐含转换规则,当形参和实参不是指针或引用类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的内容复制一份,在该函数运行结束的时候形参被释放,而实参内容不会改变。
而如果函数的参数是指针或引用型类型变量,在调用该函数的过程中,传个函数的是实参的地址,在函数体内部使用的也是实参的地址,即使用的就是实参本身。所以在函数体内部可以改变实参的值。
看下面的例子:
*/

#include
using namespace std;
int swap(int a,int b); //子函数swap的参数为传值使用,使用的原始数据不会被子函数swap修改
int pswap(int &c,int &d);//子函数pswap的参数为传地址使用(引用),引用的原始数据能被子函数pawap修改
//函数申明 格式: 是否返回值int/void 函数名pswap(参数的数值类型int 引用&/传值 形式参量的名称c,…)在这里形参的名称可有可无
int main()
{
int x=4,y=8;
int p=5,q=9;
cout<<"函数调用前:"<cout<<"x="<cout<<"p="<cout<<"--------------------"<
swap(x,y); //主函数里子函数调用的格式: 子函数名(实参1,实参2,…),这里函数名前面不加int、void,实参前面不写数值类型
pswap(p,q); //在这里 x、y、p、q是实际参数
cout<<"函数调用后:"<cout<<"x="<cout<<"p="<return 0;
}

int swap(int a,int b) //子函数体 格式 : 是否返回 函数名 (数值类型 形参1,数值类型,形参2,…)
//交换a、b的值,这里a、b是形式参数
{
int temp=a;
a=b;
b=temp;
return 0;
}
int pswap(int &c,int &d) //交换c、d的值,这里c、d是形式参数
{
int temp;
temp=c;
c=d;
d=temp;
return 0;
}
/*------------------
运行结果:
函数调用前:
x=4,y=8
p=5,q=9
--------------------
函数调用后:
x=4,y=8
p=9,q=5
Press any key to continue
从结果可以看出,对于一般类型的实参,在程序运行完后其值不变,而对于引用或者指针类型的实参,由于用的是它本身的地址,所以程序运行完后它们的值改变了。

注意比较(1)函数申明、(2)函数调用、(3)函数定义 的不同。
(1) int swap(int a,int b); //子函数swap的参数为传值使用,使用的原始数据不会被子函数swap修改
int pswap(int &c,int &d);//子函数pswap的参数为传地址使用(引用),引用的原始数据能被子函数pawap修改
//函数申明 格式: 是否返回值int/void 函数名pswap(参数的数值类型int 引用&/传值 形式参量的名称c,…)在这里形参的名称可有可无
(2) swap(x,y); //主函数里子函数调用的格式: 子函数名(实参1,实参2,…),这里函数名前面不加int、void,实参前面不写数值类型
pswap(p,q); //在这里 x、y、p、q是实际参数
(3) int swap(int a,int b) //子函数体 格式 : 是否返回 函数名 (数值类型 形参1,数值类型,形参2,…)