第2.9章: 引用

English

什么是引用?

C++ 中的引用是另一个对象的别名。 它不创建新对象,只是为已有对象提供一个新名字。 在本章中,我们只讨论左值引用。

语法

引用在类型之后用 & 符号声明。 它在初始化时必须始终绑定到一个已存在的对象上:


#include <cstddef>

::std::size_t x{42zu};
::std::size_t& ref{x}; // ref is a reference bound to object x

这里,ref 并不是一个独立的对象。它是 x 的另一个名字。

基本行为


#include <cstddef>

::std::size_t a{10zu};
::std::size_t& r{a}; // r bound to object a

r = 20zu; // modifies object a, because r refers to a
// now a == 20

通过引用赋值会改变原对象。 引用必须在声明时初始化,且不能重新绑定。

常量引用

你也可以把引用声明为 T const&。 这意味着不能通过该引用来修改原对象。


#include <cstddef>

::std::size_t b{30zu};
::std::size_t const& cr{b}; // const reference bound to object b

// cr = 40zu; // error: cannot assign through const reference

T const& 的生命周期延长

C++ 中有一条特殊规则:当你把 T const& 绑定到一个临时对象上时, 该临时对象的生命周期会被延长到与引用的生命周期相同。


#include <cstddef>

::std::size_t const& r{42zu}; // binds to a temporary object
// The temporary object lives as long as r does

如果没有这条规则,临时对象会在整个表达式结束时被销毁, 从而使引用悬空。生命周期延长让 T const& 与临时对象配合使用是安全的。

小心 T &a, b;

一个常见错误是在一行中同时声明多个对象并使用引用:


#include <cstddef>

::std::size_t obj1{1zu};
::std::size_t obj2{2zu};

::std::size_t &a{obj1}, b{obj2};

在这个声明中:

& 只绑定到紧跟在它后面的那个名字。 若要把两者都声明为引用,你必须写成:


::std::size_t obj3{3zu};
::std::size_t obj4{4zu};

::std::size_t &c{obj3}, &d{obj4}; // both c and d are references

最佳实践:每行只声明一个引用,以避免混淆。

要点