C/C++ 禁止在函数调用时直接传递数组的内容,而是强制传递数组指针,而对于结构体和对象没有这种限制,调用函数时既可以传递指针,也可以直接传递内容;
但是在 C++ 中,我们有了一种比指针更加便捷的传递聚合类型数据的方式,那就是引用(Reference)。
引用可以看做是数据的一个别名,通过这个别名和原来的名字都能够找到这份数据。
引用类似于 Windows 中的快捷方式,一个可执行程序可以有多个快捷方式,通过这些快捷方式和可执行程序本身都能够运行程序;
引用的定义方式类似于指针,只是用&取代了*,语法格式为:
type &name = data;
注意,引用在定义时需要添加&,在使用时不能添加&,使用时添加&表示取地址。
由于引用 r 和原始变量 a 都是指向同一地址,所以通过引用也可以修改原始变量中所存储的数据,
#include <iostream>
using namespace std;
int main() {
int a = 99;
int &r = a;
r = 47;
cout << a << ", " << r << endl;
return 0;
}
如果读者不希望通过引用来修改原始的数据,那么可以在定义时添加 const 限制,
引用和指针的区别
1) 引用必须在定义时初始化,并且以后也要从一而终,不能再指向其他数据;而指针没有这个限制,指针在定义时不必赋值,以后也能指向任意数据。
2) 可以有 const 指针,但是没有 const 引用。也就是说,引用变量不能定义为下面的形式:
3) 指针可以有多级,但是引用只能有一级,例如,int **p是合法的,而int &&r是不合法的。如果希望定义一个引用变量来指代另外一个引用变量,那么也只需要加一个&
4) 指针和引用的自增(++)自减(—)运算意义不一样。对指针使用 ++ 表示指向下一份数据,对引用使用 ++ 表示它所指代的数据本身加 1;自减(—)也是类似的道理。
概括起来说,将引用类型的形参添加 const 限制的理由有三个:
- 使用 const 可以避免无意中修改数据的编程错误;
- 使用 const 能让函数接收 const 和非 const 类型的实参,否则将只能接收非 const 类型的实参;
- 使用 const 引用能够让函数正确生成并使用临时变量。