1.引用的基本特性
一.引用即别名
•声明一个标识符为引用,即表示该标识符可作为另一个有名或无名对象的别名
–int a = 10;
int& b = a;
int& c = b;
++c;
cout << a << endl; // 11
int const& d = c;
++d; // ERROR
•在C++中,无名对象通常都被处理为右值,只能通过带有常属性的引用引用之
–int const& a = 10; // 纯右值
int const& b = 20;
int const& c = a + b; // 将亡右值
二.引用必须初始化
•引用必须在定义的同时初始化,不允许先定义再赋值
–int a = 10;
int& b = a; // OK
–int a = 10;
int& b; // ERROR
b = a;
三.引用不能为空
•无法定义一个什么都不引用的引用
–int& r = NULL; // ERROR
•但“野引用”或称“悬空引用”确实是存在的
–int& r = *new int (1);
++r;
cout << r << endl; // 2
delete &r;
++r; // 未定义
•解引用一个野引用,就跟解引用一个野指针一样,其结果将是未定义的,可能导致崩溃(段错误),
可能意外地修改了其它有效堆内存中的数据,也可能什么也没有发生而且结果还很正确,
但没有人能保证到底会是哪种结果
三.引用不能更换目标
•引用一经初始化便不能再引用其它对象
–int a = 10, b = 20;
int& c = a; // c是a的引用,a是c的目标
c = b; // 将b的值赋给c的目标即a,而非令c引用b
•引用只有在其定义及初始化语境中具有“名”语义,一旦完成了定义及初始化,
引用就和普通变量名一样,被赋予了“实”语义,即代表它的目标,而不是别名本身