一. 引用变量
引用变量使用&来声明。&并不是地址操作符,而是类型标示符的一部分。
int main(int argc, char* argv[])
{
int x = 2;
int & y = x;
y = 3;
int m = 4;
printf("x = %d, y = %d, m = %d/n", x, y, m);
printf("x address = %d, y address = %d/n", &x, &y);
printf("/ny = m;/n");
y = m;
printf("x = %d, y = %d, m = %d/n", x, y, m);
printf("x address = %d, y address = %d, m address = %d/n", &x, &y, &m);
return 0;
}
执行结果:
x = 3, y = 3, m = 4
x address = 1310588, y address = 1310588
y = m;
x = 4, y = 4, m = 4
x address = 1310588, y address = 1310588, m address = 1310580
通过上例可以看出:
①x和y指向相同的地址,x和y的值相等。
②m修正y的值,但没有改变y的引用,依然指向x。
③引用必须赋初值,并且不能改变;所以int & y = x;等价于int * const py = &x;
引用y和表达式(*py)扮演了相同的角色。
二. 将引用用作函数参数
引用经常被用于函数参数,使得函数中的变量名称为调用程序中的变量的别名。这种按照引用传递可以直接访问调用函数中的变量。
int main(int argc, char* argv[])
{
int x = 10;
int y = 20;
printf("x = %d, y = %d/n", x, y);
swapref(x, y);
printf("/ncall swapref(x, y);/n");
printf("x = %d, y = %d/n", x, y);
return 0;
}
void swapref(int &x, int &y) {
int temp = x;
x = y;
y = temp;
}
执行结果:
x = 10, y = 20
call swapref(x, y);
x = 20, y = 10
如果向swapref(x +2, y)传递这样的参数,编译器会给出错误信息,因为x+2并不是变量。但在参数为const引用时,C++却允许这样做,此时仅仅是使用变量,并不能对其进行赋值操作。
int main(int argc, char* argv[])
{
int x = 5;
int y = square(x+1);
printf("x = %d, the result = %d/n", x, y);
return 0;
}
int square(const int & x) {
return x*x;
}
执行结果:x = 5, the result = 36