引用经常被用作函数参数,使得函数中的变量名成为调用程序中的变量的别名。这种传递参数的方法称为按引用传递。按引用传递允许被调用的函数能够访问调用函数中的变量。
引用传递对应的是按值传递,先说按值传递
int add(int i,int j);
int add(int i,int j) {
return i+j;
}
int main(){
int x = 1;
int y = 2;
return add(x,y);
}
x和y传递给add中的i和j,这里面的4个变量是不同的,也就是i和j与x和y是没有关系的,只是把1和2的值赋予给了i和j,对i和j的改变与x和y没有任何关系。
如果是引用传递相当于把参数的引用传递过去,对参数的改变是真的改变。
int add(int &i,int &j);
int add(int &i,int &j) {
return i+j;
}
int main(){
int x = 1;
int y = 2;
return add(x,y);
}
这里面的x和y是传递的引用,相当于x和i是同一个变量,y和j是同一个变量,对i和j的改变会改变x和y的值。
传递引用有许多限制,没有传值方便,如add(i+1,j+1);如果是传值这样是没有问题,如果是引用,这种算数表达式是不行的。
double cube(double a);
double refcube(double &ra);
int main(){
double a = 3;
cout << cube(a+1) << endl;
cout << a << endl;
cout << refcube(a) << endl;
cout << a << endl;
}
double cube(double a){
a = a*a;
return a;
}
double refcube(double &a){
a = a*a;
return a;
}
refcube这个函数目的并不是修改参数的值,但是不小心赋值的变量正好是传递的对象。为了避免这种错误可以使用常量引用,这样的话和值传递基本相同,有一点好处就是可以节省拷贝对象的空间。
double refcube(const double &ra);
或者在写代码时,使用临时变量进行存储
double refcube(double &a){
double b = a*a;
return b;
}