定义函数时更的参数叫形参。如Swap(int a,int b),这里的a和b就是形参。调用函数时传递的参数就是实参,如Swap(m,n),这里的m,n就是实参。实参可以是常量,变量,表达式,但是类型必须与形参一致。在函数未被调用时,形参不占用内存空间,只有在调用时才会分配内存空间。函数参数传递的方式有两种:值调用与引用调用。
1.值调用
值调用就是调用函数时,给形参分配内存空间,将实参拷贝给形参,之后的函数执行中形参和实参就脱离了关系,谁都不影响谁。也就是值调用时,只是用实参的值初始化下形参,之后两者互不影响。
int _tmain(int argc, _TCHAR* argv[])
{
int x=5, y=10;
cout<<"x="<<x<<" y="<<y<<endl;
Swap(x,y);
cout<<"x="<<x<<" y="<<y<<endl;
return 0;
}
void Swap(int a, int b)
{
int t;
t=a;
a=b;
b=t;
}
运行结果是: x=5,y=10
x=5,y=10
x和y分别传值给a和b后,a跟b的值在Swap内怎样变化都影响不到x和y,所以两次输出x和y的值没有变化。
2.引用调用
引用是一种特殊类型的变量,我们可以认为它是另一个变量的别名,利用引用名和原来的变量名访问变量的效果是一样的。引用的形式是:类型标识符 &引用名。比如:
int i, j;
int &ri=i; // 建立一个int型的引用ri,并将其初始化为变量i的一个别名
j=10;
ri=j; // 相当于 i=j;
声明一个引用时,必须同时对它进行初始化,使它指向一个已存在的对象;一旦一个引用被初始化后,就不能改为指向其它对象。简单说就是引用定义的时候就指定它指向的变量,之后就不能变了。
引用可以作为形参,比如void swap(int& a, int& b) {...}。这个时候引用就不需要对其初始化了,因为形参只是类型说明,主调函数调用这个函数时才会为形参分配内存,也才会用实参来初始化形参。用引用调用后,形参就是实参的别名而已,对形参做的任何改变都会影响实参发生同样的改变。引用调用说明下:
#include<iostream>
using namespace std;
void Swap(int& a, int& b);
int _tmain(int argc, _TCHAR* argv[])
{
int x=5, y=10;
cout<<"x="<<x<<" y="<<y<<endl;
Swap(x,y);
cout<<"x="<<x<<" y="<<y<<endl;
return 0;
}
void Swap(int& a, int& b)
{
int t;
t=a;
a=b;
b=t;
}
运行结果就跟我们想的一样了:
x=5 y=10
x=10 y=5
引用调用后x和y的值成功的交换了。值调用和引用调用的区别只是函数的形参写法不同,主调函数调用被调函数时的调用语句是一样的。