第2.9章: 引用
什么是引用?
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};
在这个声明中:
a是绑定到obj1的引用。b只是一个普通的::std::size_t对象,用obj2初始化。
& 只绑定到紧跟在它后面的那个名字。
若要把两者都声明为引用,你必须写成:
::std::size_t obj3{3zu};
::std::size_t obj4{4zu};
::std::size_t &c{obj3}, &d{obj4}; // both c and d are references
最佳实践:每行只声明一个引用,以避免混淆。
要点
- 引用是已有对象的别名。
- 在类型之后用
&声明。 - 必须在声明时初始化,且不能重新绑定。
- 通过引用赋值会修改原对象。
- 使用
T const&来防止修改。 T const&会延长它所绑定的临时对象的生命周期。- 要注意:
T &a, b;只会让a成为引用,b不是。