引用

  1. 引用被声明时必须初始化
    int &r; (错)
    int a; int &r = a 正确
  2. 引用初始化的目标必须是一个对象
    int &r = 2 (错)
    int a; int &r = a (正确)
  3. 引用的目标不能是一个表达式。
    int &r = 2*4 (错)
    int a; int &r = a (正确)
  4. 允许引用的目标没初始化
    int a; int &r = a; 正确
    int a = 2; int &r = a; 正确

    引用和常量

  5. 引用所引用的目标必须和自己相同类型
    const int a; int &r = a; (错)
    const int a; const int &r = a; (正确)
  6. 声明为常量的引用,允许引用一个非常量的目标
    int a; const int &r = a (正确)
    在这种情况下:
    允许修改 a 的值来得到对应修改的 r
    但不允许通过 r 来修改 a 的值
  7. 允许声明为常量的引用所引用的对象是一个字面值常量
    int &r = 2; (正确)
  8. 允许声明为常量的引用初始值为表达式
    第一种情况:
    int a=2, b=4; const int &r = a*b (正确)
    在这种情况下,在后期修改 a 或 b 的值 ,r 的值永远是 8
    第二种情况:
    const int &r = 2*4 (正确)

    引用和指针

    引用其可以引用任何相同类型的对象,但却不能引用指针,除非把引用声明为指针。
    当引用的对象是一个指针时,情况就变得有些复杂。
  9. 使用指针来初始化引用
    int a=2; int *p=a; int &r = *p;
    p 指向的是 a ,而 r 引用的也是 a
  10. 引用一个指针对象
    int a; int *p=a; int *&r = p;
    此时,r 就是指针 p。所有对 p 的操作,对 r 同样适应
  11. 引用本身不允许被再次进行引用,从这个角度看,引用本身也是常量。
    无论 const int &r =a; 还是 int const &r = a;其作用的是引用的目标是一个常量。
    而非常量数据类型,给以被转换为常量的数据类型。

    引用和常量和指针

    这种情况似乎复杂了很多
    声明为常量的引用其引用的目标可以是常量也可以是非常量。
    int a; const int &r = a; (引用一个非常量)
    const int a; const int &r = a; (引用一个常量)
    非常量的引用不允许引用一个常量目标
    const int a; int &r = a; (这是错误的行为)