引用 (reference)#
引用一个对象, 即创建已有对象的一个别名: 它只是一个别名而非新的对象.
1int value;
2int& ref = value;
3
4ref = 3; // 通过引用访问对象, 使得 value = 3
交叉内容#
引用与初始化、赋值#
引用在声明时必须确定引用的对象, 因而必须被初始化, 往后对它的所有操作都是对其引用的对象进行:
1int& a; // 错误: 未初始化引用
2
3int value{0};
4int& reference{value}; // 必须在这里初始化它
5reference = 3; // 相当于 value = 3
引用与 const
#
由于引用不是对象, const
不能作用于它.
1int value;
2int const& ref1 = value; // const 向左作用于 int; 引用的 int 对象不可改变
3int& const ref2; // 错误: 引用本身不是对象, 不能用 const 限定它
引用与值类别#
T&
只能引用左值即 "已经存在的对象", 因此不进行会产生临时对象的隐式类型转换.
1int value = 0;
2int& reference = value;
1double value = 0;
2int& reference = value; // 错误: double 隐式类型转换为 int 是产生新的临时对象
1class A {};
2class B : public A {};
3
4B b;
5A& = b; // 正确: 基类引用兼容派生类
T const&
既能引用左值又能引用右值.
既然能引用右值即临时值, 则允许在引用时发生隐式类型转换; 但这将会引用转换产生的临时对象而不是原本的对象.
1double value = 0;
2int const& reference = value; // 正确: T const& 能够引用临时对象
3
4value = 1;
5std::cout << reference; // 输出 0