Chapter 6: References ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 引用允许程序为变量创建新的名字。它们为指针提供了一种更为简单与安全的替代品,在可能时替代指针。 创建引用 ============== 引用的声明与普通变量的声明类似,不同的是在数据类型与变量名之间添加一个取地址符号。而且,在变量声明的同时,必须使用特定类型的变量对其进行初始化。 .. code:: int x = 5; int& r = x; // r is an alias to x int &s = x; // alternative syntax int& t; // error: must be initialized 一旦引用被赋值,它不能用于其它变量。引用的作用变为变量的别名,并且可以像原始变量一样使用。 .. code:: r = 10; // assigns value to r/x 引用与指针 =============== 引用类似于指向相同内容的指针。然而,指针是一个指向另一个变量或对象的变量,引用只是一个别名,因而没有其自己的地址。 .. code:: int* ptr = &r; // ptr assigned address to x 引用与指针使用指导 ====================== 通常,当指针不需要被重新赋值时,应使用引用,引用比指针更安全,因为它总是指向某个变量。这意味着无需像指针那样,检测一个引用是否为空。引用也可能是不可用的-例如,当引用指向一个空指针时-但相对于指针,更容易避免引用的此类错误。 .. code:: int* ptr = nullptr; // null pointer int& ref = *ptr; ref = 10; // error: invalid memory access 右值引用 =============== C++11出现了一种新的引用类型,即所谓的右值引用。这种引用可以绑定并修改临时变量(右值),例如字面量值与函数返回值。右值(rvalue)引用是通过在类型后添加两个地址符号来指定的。 .. code:: int&& ref = 1 + 2; // rvalue reference 右值引用扩展了临时变量的生命周期,并且允许其像普通变量一样使用。 .. code:: ref += 3; cout << ref; // "6" 右值引用的优点在于,当处理临时对象时,可以避免不必要的拷贝。这提供了更好的性能,特别是处理较大的类型时,例如字符串与对象。