引用概述

参考:References (C++)

引用 vs. 指针

引用(reference)相对于指针(pointer)而言,有如下异同:

  1. 相似:存储其他对象的内存地址
  2. 不同:初始化后的引用不能引用其他对象或设置为空

lvalue和rvalue

引用可分为左值引用(lvalue)和右值引用(rvalue):

  1. lvalue引用命名变量,用符号&表示
  2. rvalue引用临时对象,用符号&&表示

语法

通用语法如下:

[storage-class-specifiers] [cv-qualifiers] type-specifiers declarator [= expression];

简化语法如下:

[storage-class-specifiers] [cv-qualifiers] type-specifiers [& or &&] [cv-qualifiers] identifier [= expression];

引用声明顺序如下:

  1. 说明符
    • 可选的存储类说明符
    • 可选的cv限定符
    • 类说明符:类名
  2. 声明符
    • &或者&&运算符
    • 可选的cv限定符
    • 标识符
  3. 可选的初始化器

引用类型的声明必须包含初始化器,以下情况除外:

  • 显式extern声明
  • 类成员的声明
  • 类内声明
  • 函数的参数或函数的返回类型声明

示例

引用对象拥有对象的地址,但其操作和对象一样,可看成是对象的别名

struct S {
    short i;
};

int main() {
    S s;   // Declare the object.
    S &SRef = s;   // Declare the reference.

    cout << (void *) &s << endl;
    cout << (void *) &SRef << endl;

    // 已初始化的引用不能引用其他对象
    S ss;
    SRef = ss;

    cout << (void *) &s << endl;
    cout << (void *) &ss << endl;
    cout << (void *) &SRef << endl;
}

结果:

0x7ffc568084d0
0x7ffc568084d0
0x7ffc568084d0 // s
0x7ffc568084e0 // ss
0x7ffc568084d0 // SRef