变量名
定义:变量名是对一段空间的别名,用户可以使用变量名来使用某一段空间
所以一个空间可以有多个变量名来使用这个空间
定义
引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。引用(reference)是c++对c语言的重要扩充。引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。
其格式为:类型 &引用变量名 = 已定义过的变量名。
由于C++是一个强类型的语言,所以在引用的时候必须初始化,不然编译器就会报错
同时引用只能定义一次,不能转换为其他的变量
引用作为变量名的别名,很多场合可以代替指针
引用在作为函数的形参的时候,可以不进行初始化,因为他在传参的时候进行了初始化,这样代码就简单好认,避免了复杂的取地址操作
void swap (int& a,int& b)
{
int c=0;
c=a;
a=b;
b=c;
}
int main(int argc, char *argv[])
{
int a=2,b=3;
swap (a,b);
printf ("a=%d b=%d\n",a,b);
const引用的分析
我们知道,在c语言中,如果我们对一个变量进行const修饰为只读变量,但是我们依旧可以通过指针来改变这一片空间的值,但是在c++中就变得不同了
其实我们可以通过实验发现,引用其实就是被封装起来的指针
例:const int& a=b //他就是不能被修改的,用一个常变量去初始化常引用
当引用去引用一个常量的时候,必须要加上一个const,因为自变量是没有地址储存的
const int& a =10; //这时候c++编译器会为a来分配空间
本质的分析
int& a ==== int *const a;
他的本质就是一个指针常量,所以引用的大小就是也是机器位数的大小,32位(4字节),64位(8字节)
引用只是一个别名,他隐藏了引用储存空间这一个细节,对引用的操作就是对指针所指向地址的操作,他很多时候帮我们进行了取地址操作,就像上面那个swap函数,让我们不用深入到底层
用老师的话来说,用引用和指针的区别就是开自动挡的车和手动挡的区别
引用的优点
功能性:可以满足多数需要指针的场合(本质就是指针常量)
安全性:它可以避免由于指针不当而带来的内存错误(他只能在初始化的时候定义)
操作性:简单用,又不失强大的功能(避免了很多对地址的操作)
它可以尽可能的避开内存错误
引用作为返回值
当函数返回值为引用的时候
若返回的是栈变量,则不能成为其他引用的初始值,不能作为左值使用,因为那一块内存空间已经不存在了,其实在现在的g++编译器中,这些已经被优化掉了,引用就只能使用一个变量来接收,c++在对类型的检查还是很严谨的。
C++对三木运算符的优化
当三木运算符都是变量的时候,三木运算符可以作为左值,返回的是引用变量
例子: (a>b ? a : b)=10;
这样大的可以被赋值为10
但是如果三木运算符中存在常量,编译器就会报错