c++形参实参

来源:互联网 发布:c 并行编程 parallel 编辑:程序博客网 时间:2024/05/22 05:05

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是实际参数