值传递:函数操作的是形参,将实参拷贝给形参,拷贝完成后对形参修改不会影响实参,实参的值不会改变。
void swapValue(int x, int y)
{
cout << "交换前:" << endl;
cout << "x=" <<x<<";y="<<y<< endl;
int temp;
temp = x;
x = y;
y = temp;
cout << "交换后:" << endl;
cout << "x=" << x << ";y=" << y << endl;
}
int main()
{
int a = 10;
int b = 15;
swapValue(a, b);
cout << "a=" << a << endl;
cout << "b=" << b << endl;
}
可以看到调用swapValue函数只对形参x和y的值进行了互换,而并不影响实参a和b的值。
引用传递:引用是给对象起了另外一个名字,用声明符 &定义应用类型,引用必须初始化,也就是说一旦定义引用,就必须给他绑定个对象,他和对象共用一个地址,改变对象的值,引用也会改变。改变引用的值,对象也会改变。引用作为参数传递时不进行拷贝。
例:
int main()
{
int a = 10;
int & b = a;
cout << "a=" << a<<endl;
cout << "b=" << b << endl;
cout << "a的地址=" << &a << endl;
cout << "b的地址=" << &b << endl;
cout << "改变a:" << endl;
a++;
cout << "a=" << a << endl;
cout << "b=" << b << endl;
cout << "a的地址=" << &a << endl;
cout << "b的地址=" << &b << endl;
cout << "改变引用b:" << endl;
b++;
cout << "a=" << a << endl;
cout << "b=" << b << endl;
cout << "a的地址=" << &a << endl;
cout << "b的地址=" << &b << endl;
}
上面的例子可以看出对象值的改变引用也随之变化,引用的变化对象值也随之变化,但是他们的地址一直不变,而且是同一个地址。
例:
void swapRefer(int& x, int& y)
{
cout << "交换前:" << endl;
cout << "x=" << x << ";y=" << y << endl;
cout<<"x="<<&x<< ";y=" <<&y << endl;
int temp;
temp = x;
x = y;
y = temp;
cout << "交换后:" << endl;
cout << "x=" << x << ";y=" << y << endl;
cout << "x=" << &x << ";y=" << &y << endl;
}
int main()
{
int a = 10;
int& aRe = a;
int b = 15;
int& bRe = b;
swapRefer(aRe,bRe);
cout << "a=" << a << " a地址="<<&a<<endl;
cout << "b=" << b <<" b地址=" <<&b<<endl;
}
传递引用时可以看到实参没有拷贝给形参,引用传递操作的地址是实参地址 ,对形参进行操作就是对实参进行操作。