引用变量
C++新增了一种数据类型,即引用变量
引用是已定义的变量的别名(另外的一个名称),例如
将变量b作为变量a的引用,那么就可以交替使用a和b来使用该变量
引用变量的主要用途是用作函数的形参,通过将引用变量作为参数,函数将会使用原始的数据,而不是使用其副本,这样除了指针之外,引用也为函数处理大型的结构提供了一种非常方便的途径
引用变量的创建
在C和C++中使用&符号来指示变量的地址,C++给&符号赋予了另外的含义,即用来声明引用
int a;
int & b = a;
此时&不代表取地址符,而是代表着b是a的引用变量,int & 指的是指向int的引用
以上的声明允许a和b进行互换,因为它们指向了相同的内存空间,并且存储了相同的值
运行结果:
通过这个例子,我们可以看出a与b的存储地址是一样的,因此a和b代表的都是同一个值
引用与指针的区别
必须在声明引用时就将其进行初始化,而不是像指针那样,先声明再赋值
引用更接近与const指针,必须在创建时就进行初始化,一但与某个变量关联起来,就不会改变,例如
int a = 10;
int & b = a;
int *const p = &a;
此时b与p都不可以修改它们的指向,即可以使用b来修改a的值,但不能将b与其他的变量关联起来,p也是一样,可以使用p来修改a的值,但不能修改p的指向,p只能指向a
例如:
运行结果:
此时我们可以看出,b = c 这条语句仅仅是将c的值赋值给b,而b还是只与a相互关联,并没有改变这个关联的关系,b与c所在的内存空间也不一样
引用的用途
引用通常作为函数的参数,使得函数中的变量名作为调用程序中变量的别名,这种方式称为按引用传递,按引用传递允许被调用的函数能够访问调用函数中的变量
C语言只能够进行按值传递,按值传递导致被调用函数使用调用程序的值的拷贝,C语言也提供了按指针传递的方法,可以避免这种限制
例子:使用引用作为实参
运行结果:
此时使用引用的方式不使用指针也可以在函数内部改变实参的值
注意:如果不想修改实参的值,那么就使用按值传递的方式
引用的特性
如果使用按引用进行传递时,引用的限制会非常严格
如果使用了引用传递,那么传递的就应该是一个变量的别名,实参就应该是一个变量,不能是一个表达式,也不能是常量,但是如果使用const关键字,就可以传递常量
如果实参与引用的参数不匹配,C++将会产生临时变量,当前,仅当参数为const引用时,C++才允许这样做,那么什么时候会创建临时变量呢?编译器会在下面两种情况下产生临时变量:
实参的类型正确,但不是左值(左值)
实参的类型不正确,但可以转化为正确的值
如果发生实参与函数参数里的引用变量不匹配时,并且函数形参的引用是const类型的,那么编译器会将实参传递给一个临时的变量,此时这个临时变量再与函数形参里的引用变量再进行关联,即形参的引用实际上是一个临时变量的引用
此时5被传递给一个临时变量,该临时变量与a进行了关联,此时才能通过编译,并且,临时变量不会造成任何不利的影响,反而会使函数在处理的参数种类方面更加通用
因此,如果在声明时将引用指定为const,C++将在必要时产生临时变量,实际上,对于形参为const引用的C++函数,如果实参不匹配,则其行为更像是按值传递,为确保原始的数据不被修改,会使用临时变量进行存储值
注意:如果函数调用的参数不是左值或者相对应的const引用参数的类型不匹配,则c++将创建类型正确的匿名变量,将函数调用的参数的值传递给该匿名变量,并让参数引用匿名变量
形参引用使用const好处
可以避免无意中修改数据的编程错误
使函数能够出来const和非const实参,否则只能接收非const数据
能够使函数正确生成并使用临时变量