Chapter 6: References

引用允许程序为变量创建新的名字。它们为指针提供了一种更为简单与安全的替代品,在可能时替代指针。

创建引用

引用的声明与普通变量的声明类似,不同的是在数据类型与变量名之间添加一个取地址符号。而且,在变量声明的同时,必须使用特定类型的变量对其进行初始化。

int x = 5;
int& r = x; // r is an alias to x
int &s = x; // alternative syntax
int& t; // error: must be initialized

一旦引用被赋值,它不能用于其它变量。引用的作用变为变量的别名,并且可以像原始变量一样使用。

r = 10; // assigns value to r/x

引用与指针

引用类似于指向相同内容的指针。然而,指针是一个指向另一个变量或对象的变量,引用只是一个别名,因而没有其自己的地址。

int* ptr = &r; // ptr assigned address to x

引用与指针使用指导

通常,当指针不需要被重新赋值时,应使用引用,引用比指针更安全,因为它总是指向某个变量。这意味着无需像指针那样,检测一个引用是否为空。引用也可能是不可用的-例如,当引用指向一个空指针时-但相对于指针,更容易避免引用的此类错误。

int* ptr = nullptr; // null pointer
int& ref = *ptr;
ref = 10; // error: invalid memory access

右值引用

C++11出现了一种新的引用类型,即所谓的右值引用。这种引用可以绑定并修改临时变量(右值),例如字面量值与函数返回值。右值(rvalue)引用是通过在类型后添加两个地址符号来指定的。

int&& ref = 1 + 2; // rvalue reference

右值引用扩展了临时变量的生命周期,并且允许其像普通变量一样使用。

ref += 3;
cout << ref; // "6"

右值引用的优点在于,当处理临时对象时,可以避免不必要的拷贝。这提供了更好的性能,特别是处理较大的类型时,例如字符串与对象。