c++中引用是已定义的变量的别名,例如,如果把b作为a变量的引用,则可以交替使用a和b来表示该变量。引用的主要用途是作为函数的形参,通过将引用变量作为参数,函数将使用原始数据,而不是副本(把变量之间传入函数使用的是变量的副本),因此引用为处理大型数据参数的函数提供了一种很好的办法。
int a;
int & b = a;
注意:
1.引用变量b和其引用的变量a它们指向相同的值和内存单元,因此改变任意一个值,另一个变量也会跟随一起改变。
2.声明引用的同时必须将其初始化,而不能像指针那样,可以先声明后赋值。(int a; int & b ; b = a;这样是错误的)
3.引用初始化后,就不能被改变。
#include
void swapr(int & a,int & b);
void swapp(int * p, int *q);
void swapv(int a, int b);
int main(int argc, const char * argv[]) {
using namespace std;
int wallet1 = 300;
int wallet2 = 500;
cout << "wallet1 = $" << wallet1;
cout << " wallet2 = $" << wallet2 << endl;
cout << "Using references to swap contents:\n";
swapr(wallet1,wallet2);
cout << "wallet1 = $" << wallet1;
cout << " wallet2 = $" << wallet2 << endl;
cout << "Using pointers to swap contents again:\n";
swapp(&wallet1,&wallet2);
cout << "wallet1 = $" << wallet1;
cout << " wallet2 = $" << wallet2 << endl;
cout << "Trying to use passing by value:\n";
swapv(wallet1, wallet2); // pass values of variables
cout << "wallet1 = $" << wallet1;
cout << " wallet2 = $" << wallet2 << endl;
return 0;
}
void swapr(int & a,int & b){
int temp;
temp = a;
a= b;
b=temp;
}
void swapp(int * p,int * q){
int temp;
temp = *p;
*p = *q;
*q = temp;
}
void swapv(int a,int b){
int temp;
temp = a;
a = b;
b =temp;
}
输出结果:
wallet1 = $300 wallet2 = $500
Using references to swap contents:
wallet1 = $500 wallet2 = $300
Using pointers to swap contents again:
wallet1 = $300 wallet2 = $500
Trying to use passing by value:
wallet1 = $300 wallet2 = $500
由结果可知,只有引用和指针成功地交换了变量的值,而按值传递的方法不能,那是因为函数按值传递时,传入的只是变量的一个副本,所以在函数中数值被改变后,不影响原变量的值,而应用和指针传入函数时,会同时改变原变量。为防止引用修改了变量,我们可以用const,double a(const double &b),当代码修改了b时,就会报错。
struct a
{
int data1;
int data2;
float data3;
};
那么可以编写函数原型:
void set_pc(a & ft);
同样,如果不希望改变传入的结构,可以用const:
void set_pc(const a & ft);
要注意的问题:
1. 避免返回函数终止时不再存在的内存单元引用,比如:
struct free_throws
{
int made;
int attempts;
float percent;
};
const free_throws & clone2(free_throws & ft)
{
free_throws newguy;
newguy = ft;
return newguy;
}
在函数返回一个临时变量(newguy)的引用,在函数运行结束后它将不复存在。
为避免这种问题,可以返回一个座位参数传递给函数的引用:
const free_throws & clone2(free_throws & newguy,free_throws & ft)
{
newguy = ft;
return newguy;
}
或者采用new来分配新的储存空间:(当不使用时,要用delete释放)
const free_throws & clone2(free_throws & ft)
{
free_throws * newguy;
*newguy = ft;
return *newguy;
}
对于使用传递的值不作修改的函数: