引用的基本概念
引用变量是C++新增的符合类型。
引用是已定义的变量的别名。
引用的主要用途是用作函数的形参和返回值。
声明/创建引用的语法: 数据类型 &引用名=原变量名;
注意:
1 引用的数据类型要与原变量的数据类型相同。
2 引用名和原变量名可以互换,它们值和内存单元是相同的。
3 必须在声明引用的时候初始化,初始化后不可以改变。
4 C和C++使用&符号来指示/取变量的地址,C++给&符号赋予了另一种含义。
引用的本质:
引用是指针常量的伪装。
引用是编译器提供的一个有用且有安全的工具,去除了指针的一些缺点,禁止了部分不安全的操作。
变量是什么?变量就是一个在程序执行过程中可以改变的量。
换一个角度,变量是一块内存区域的名字,它代表了这块内存区域,当我们对变量进行修改的时候,会引起内存区域中内容的改变。
引用用于函数的参数
把函数的形参声明为引用,调用函数的时候,形参将成为实参的别名。
这种方法也叫按引用传递或传引用。(传值、传地址、传引用只是说法不同,其实都是传值。)
引用的本质是指针,传递的是变量的地址,在函数中,修改形参会影响实参。
1 传引用的代码更简洁。
2 传引用不必使用二级指针。
3 引用的属性和特别之处。
引用的形参和const
const的用途:
1 普通变量、指针、函数形参,加上const修饰表示不可以改变。
2 引用的形参的const有特别之处
如果传值的函数,实参可以是常量,也可以是变量。如果传地址和传引用,实参就一定要用变量,这样的话,使用起来就不方便了,所以C++引入const
引用的实参和const
如果引用的数据对象类型不匹配,当引用为const时,C++将创建临时变量,让引用指向临时变量。
什么时候将创建临时变量呢?
1 首先引用是const
2 然后数据对象的类型时正确的,但不是左值。
3 数据对象的类型不正确,但可以转换为正确的类型。
结论:如果函数的实参不是左值或 与const引用形参的类型不匹配,那么C++将会创建正确类型的匿名变量,将实参的值传递给匿名变量,并让形参来引用该变量。
将引用形参声明为const的3个理由:
1 使用const可以避免无意中修改数据的变成错误。
2 使用const,使函数能够处理const和非const实参,否则将只能接受非const实参。
3 使用const,函数能正确生成并使用临时变量。
左值是可以被引用的数据对象,可以通过地址访问它们,例如:变量、数组元素、结构体成员、引用和解引用的指针。
非左值包括字面量(用双引号包含的字符串除外)和包含多项的表达式。
用双引号包含的字符串是字符串常量,字符串常量有地址。
引用用于函数的返回值
传统的函数返回机制与值传递类似。
函数的返回值被拷贝到一个临时位置(寄存器或栈),然后调用者程序再使用这个值。
double m=sqrt(36);
sqrt(36)的返回值6 被拷贝到临时的位置,然后赋值给m.
cout
sqrt(25)的返回值5被拷贝到临时的位置,然后传递给cout.
如果返回的是一个结构体,将把整个结构体拷贝到临时的位置。
如果返回引用不会拷贝内存。
语法:
返回值的数据类型& 函数名(形参列表);
注意:
1 如果返回局部变量的引用,其本质是野指针。
2 可以返回函数的引用形参、类的成员、全局变量、静态变量。(被引用的变量的声明周期一定要比引用长,实际开发中返回全局变量、静态变量,这两种意义不大。)
3 返回引用的函数是被引用的变量的别名,如果不想返回值被修改,将const用于引用的返回类型。