引用变量是c++中新增的一种符合类型,引用是已定义的变量的别名,也就是说其实它们的地址是一样的,它的作用主要是作为函数的形参,特别是较大的结构体时使用,可以去提高效率,原因在下文中会解释。
引用的声明
这是引用的声明方式和指针的声明方式:
int f1 = 5;
int & f2 = f1;
int p1 = 5;
int * p2 = &p1;
首先引用变量的声明和指针很类似,好像只不过把 ‘ * ’ 换成了 ‘ & ’ ,其实不然,其中一个差别就是引用必须在声明的时候初始化,而不可以像指针一样先声明在赋值。
其次引用声明允许f1和f2之间相互转换,因为他们具有同样的值和内存单元。
将引用作为函数的参数
引用经常被作为函数的参数,因为它具有一种特性,不用指针传递就可以在函数中改变参数的值,被称作引用传递,C语言中值的传递其实是很“沉重”的,因为它会把我们的参数进行拷贝,用拷贝的数在函数中进行一系列的计算,当我们使用引用传递的时候,我们可以不使用指针传递那么麻烦的表示就可以实现值传递的便利。
值传递与引用传递的代码区别其实很小,在调用的时候甚至一模一样,只是在声明的时候可以看到差别。
void swapa(int & a,int & b);
void swapb(int a,int b);
swapa(number1,number2);
swapb(number1,number2);
引用属性的特别之处
我们在使用值传递的时候不管我们的参数是什么,只要是最终的值满足是一个指定类型的数据就可以,但引用传递则不可以,它要求赋给表达式的值必须是一个“ 左值 ” ,
double tmp(const double &ra)
{
return ra*ra*ra;
}
double side = 5.0;
double * ps = &side;
double & pa = side;
long a = 5L;
double list[5] = {1,2,3,4,5};
double c1 = tmp(side);
double c2 = tmp(*ps);
double c3 = tmp(pa);
double c4 = tmp(list[3]);
double c5 = tmp(15.0);
double c6 = tmp(a);
double c7 = tmp(7.0 + side);
在这个例子中,前四个都是正确的,因为他们都是左值,但后三个就有一些问题了,首先c5并不是左值,它只是一个数字,但却满足条件,c6long没有办法转换为double,c7其本身就是一个表达式,不可能为左值,但如果我们一定要使用后三种例子呢?这个时候因为没有double变量,程序会自动生成一个“临时变量”