#include<iostream>
void swapr(int & a, int & b); //a, b are aliases for ints
void swapp(int * p, int * q); // p, q are address of ints
void swapv(int a, int b); // a, b are new variables
int main()
{
using namespace std;
int wallet1 = 300;
int wallet2 = 350;
cout << "wallet1 = $" << wallet1;
cout << " wallet2 = $" << wallet2 << endl; // 原始数据为wallet1 = 300, wallet2 = 350
cout << "Using references to swap contents:\n";
swapr(wallet1, wallet2); // pass variables
cout << "wallet1 = $" << wallet1;
cout << " wallet2 = $" << wallet2 << endl; // 利用引用作为参数进行交换,成功之后, wallet1 = 350, wallet2 = 300
cout << "Using pointers to swap contents again:\n";
swapp(&wallet1, &wallet2); // pass addresses of variables 一目了然地按地址传递,p是一个int指针,所以p对应的参数是地址
cout << "wallet1 = $" << wallet1;
cout << " wallet2 = $" << wallet2 << endl; // 利用指针作为参数进行交换,成功之后, wallet1 = 300, wallet2 = 350
cout << "Tring to use passing by value:\n";
swapv(wallet1, wallet2); // pass values of variables
cout << "wallet1 = $" << wallet1;
cout << " wallet2 = $" << wallet2 << endl; // 按值传递,失败,所以wallet1的值依旧是300, wallet2的值是350
system("pause"); // 按值传递时,函数不会访问当前调用的实参,函数处理的值是它本地的拷贝,这些拷贝
return 0; // 被存储在运行栈中,因此改变这些值不会影响实参的值,一旦函数结束,这些局部值也就消失了
} // 如果没有按值传递的机制,那么每个么有被声明const的参数就可能会随每次函数的调用而被改变。
// 按值传递的为好最小,需要用户做得工作也最少,按值传递时参数传递合理的缺省机制。
void swapr(int & a, int & b) // use reference
{
int temp;
temp = a; // use a, b for values of variables
a = b;
b = temp;
}
void swapp(int * p, int * q) // use pointers
{
int temp;
temp = * p; // use *p, *q for values of variables
*p = *q;
*q = temp;
}
void swapv(int a, int b) // try using balues 变量a,b复制了wallet1和wallet2的值得新变量,因此交换a,b的值不会影响wallet1和wallet2 的值
{
int temp;
temp = a; // use a, b for values of variables
a = b;
b = temp;
}
// 可以看到使用引用传递和按值传递的的函数是一样的,只有在看到函数原型才知道是引用传递还是按值传递