3.4.6 C++引用简介
在C和C++中指针的作用基本上是一样的,但是C++增加了另外一种给函数传递地址的途径。这就是按引用传递(pass-by-reference),它也存在于一些其他的编程语言中,并不是C++的发明。
可能一开始我们会觉得没有必要使用引用,可以不用引用编写所有的程序。一般说来,除开在本书后面将要知道的一些重要地方,这是确实的。在后面我们将对引用有更多的了解,但是基本思想和前面所述的指针的使用是一样的:我们可以用引用传递参数地址。引用和指针的不同之处在于,带引用的函数调用比带指针的函数调用在语法构成上更清晰(在某种情况下,使用引用实质上的确只是语法构成上不同)。如果使用引用来修改程序PassAddress.cpp,我们能看到在main()中函数调用的不同:
在函数f()的参数列表中,不用int*来传递指针,而是用int&来传递引用。在f()中,如果仅仅写‘r’(如果r是一个指针,会产生一个地址值)会得到r引用的变量值。如果对r赋值,实际上是给r引用的变量赋值。事实上,得到r中存放的地址值的惟一方法是用‘&’运算符。
在函数main()中,我们能看到引用在调用函数f()中的重要作用,其语法形式还是f(x)。尽管这看起来像是一般的按值传递,但是实际上引用的作用是传递地址,而不是值的一个拷贝。输出结果是:
所以我们可以看到,以引用传递允许一个函数去修改外部对象,就像传递一个指针所做的那样(读者可能也注意到引用使得地址传递这个事实不太明显,这在本书的后面会得到检验)。因此,通过这个简单的介绍,我们可以认为引用仅仅是语法上的一种不同方法(有时称为“语法糖”),它和指针完成同样的任务:允许函数去改变外部对象。