- 引用是给一个变量起别名
回顾下变量,它有这两个属性:名称和空间。而引用不是变量,它仅仅只是变量的别名,没有自己的独立空间,需要与它所引用的变量共享空间,所以对于引用所做的改变实际上是对它所引用的变量的改变。 -
定义引用的一般格式:
下面用程序来说明下:
编译:
由上面的输出结果可以得出结论:定义引用时一定要初始化,指明该引用变量是谁的别名。
所以修改程序如下:
这时编译就正常了,下面给它进行赋值:
编译运行:
这如何来解释呢?“引用一经初始化,就不能重新再指向其它变量了”,所以: - 在实际应用中,引用一般用作参数传递与返回值【关于这点,在后面一点进行说明】
下面用程序来验证一下:
思考一下,为什么C++不允许非const引用指向const变量呢?原因很简单,如果允许的话,那可以这样写:
下面如果是这种情况呢?
实际上是跟上一步的相反,那这能编译通过么?
也就是常量引用能指向变量,那能通过引用来更改变量的值么?
这个也很容易理解,只要是常量都不能进行更改。
下面来输出一下值:
可以看出,ref4精度确实丢失了,而我们知道引用是跟变量共享空间的,那应该值也是一样的呀,这个结果不相违背了么,实际上并没有违背,原因如下:
说了这么多跟const引用相关的知识点,其实最常用的也就是它不能再赋值。
在c语言中形参传递分为值传递和指针传递,前者是形参不能更改实参,而后者是能做到形参更改实参的,而这个引用传递也能做到更改实参,下面来介绍下它:
下面用一个两数交换的例子来说明下引用作为形参的写法:
#include <iostream> using namespace std; void swap(int &x, int &y); int main(){ int a, b; a = 10; b = 20; swap(a, b); cout<<"a="<<a<<"b="<<b<<endl; return 0; } void swap(int &x, int &y){ int temp; temp = x; x = y; y = temp; }
程序运行结果如下:
而其中引用的初始化是在参数调用中进行的:
而能实现数值交换的根本原来是由于引用共享变量的空间,对引用的更改也就是对变量的更改。
- 引用的另一个作用是用于返回引用的函数。
- 函数返回引用的一个主要目的是可以将函数放在赋值运算符的左边。
下面用程序来实验一下:
程序输出:
这个输出结果也是由于引用的作用,该引用是在函数返回的时候进行初始化,而index(3)在函数返回的时候将其引用初始化了a[3],所以对index(3)做的改变实际上也就是对a[3]做的改变,所以就这是为什么是这个结果的原因。
【注意】:不能返回对局部变量的引用,下面也用程序进行说明:
编译运行:
乍看好像很正常,但是:
这时再来看结果:
这是为什么呢?
这是因为:
- 引用访问一个变量是直接访问,而指针是间接访问。
- 引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间。
- 引用一经初始化不能再引用其它变量,而指针可以。
- 尽可能使用引用,不得已时使用指针。
这是由于:
值传递:实参要初始化形参数需要分配空间,将实参内容拷贝到形参。
引用传递:实参初始化形参数时不分配空间。
指针传递:本质是传递,实参初始化形参的时候,也是要分配空间的,分配的是4字节的空间(32位系统),如果我们要修改指针的地址,单纯用指针传递也是不行的,需要用指针的指针(**)或引用指针(*&)。