C++中在函数未被调用时,函数的形参并不占有实际的内存空间,也没有实际的值。只有函数被调用时才为形参分配存储单元,并将实参与形参相结合。每个实参都是一个表达式,其类型必须与形参相符。函数的参数传递指得就是形参与实参结合的过程,形参与实参结合的方式有值传递和引用传递。
值传递是指当发生函数调用时,给形参分配内存空间,并用实参来初始化形参(直接将实参的值传递给形参)。这一过程是参数值的单向传递过程,一旦形参获得了值便与实参脱离关系,此后无论形参发生了怎样的改变,都不会影响到实参。
引用传递方式中传递的不是值,而是内存的别名,因此实参与形参实际是同一内存地址上的数据。
C++中指针为内存地址,而引用是一种特殊类型的变量,可以被认为是另一个变量的别名,通过引用名与通过被引用的变量名访问变量的效果是一样的。
指针是内存的实际地址,而引用可以看做是内存的别名,通过指针和通过引用的访问效果是一致的,如下面代码中的swap1和swap2的功能是一样的。但是swap3不能实现指定的功能,因为其为值传递,以类的实例为形参时,是为值传递,会调用复制构造函数。
#include<iostream>
using namespace std;
class A
{
public:
int a;
};
void swap1(int * a,int * b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
void swap2(int &a,int &b)
{
int temp=a;
a=b;
b=temp;
}
void swap3(A m,A n)
{
A temp;
temp.a=m.a;
m.a=n.a;
n.a=temp.a;
}
int main()
{
int a,b,c,d;
int* p1,*p2;
A ca;
A cb;
while(true)
{
cin>>a>>b;
ca.a=a;
cb.a=b;
c=a;
d=b;
p1=&a;
p2=&b;
swap1(p1,p2);
swap2(c,d);
swap3(ca,cb);
cout<<a<<" "<<b<<endl;
cout<<c<<" "<<d<<endl;
cout<<ca.a<<" "<<cb.a<<endl;
}
return 0;
}
程序运行结果:
3 5
5 3
5 3
3 5