简介:
引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。
c++11中新增了“右值引用”,我们这里所说的引用通常指“左值引用”。
例①
int a = 10;
int &rea = a; //rea指向a,是a的另一个名字
int &rerea; //错误 引用必须被初始化
输出a 和 rea 都是10。
需要注意定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用,一旦初始化完成,引用将和它的初始值对象一直绑定在一起,无法将引用绑定到另一个对象,因此引用必须初始化。
例②
int b;
int &reb = b;
b = 5;
double &rereb = b; //错误 引用的类型需要和与之绑定的对象严格匹配,存在两个例外将在下面指出
输出b和reb都是5。
因为引用本身不是一个对象,所以不能定义引用的引用。
例③
void Swap(int &x, int &y)
{
int t = x;
x = y;
y = t;
}
输出 比如a=5,b=10,当调用函数后,a=10,b=5。
可以看出,引用的操作实际上是作用在引用所引的对象上的。
拷贝大的类类型对象或者容器对象比较低效,甚至有的类类型不支持拷贝操作,函数只能通过引用形参访问类型的对象。
例④
const int c = 10;
const int &rec = c; //正确 引用及其对应的对象都是常量
int &rerec = c; //错误,试图让一个非常量引用指向一个常量对象
把引用绑定在const对象上,我们称之为对常量的引用。
例⑤
MyClass a(); //基类
MyClassPlus b();//派生类
MyClass &rea = a;
MyClass &reb = b; //基类的引用绑定到派生类上
这是引用的类型与对象类型一致的一个例外,这里的含义是:当使用基类的引用(或指针)时,实际上我们并不清楚改引用(或指针)所绑定对象的真实类型,该对象可能是基类的对象,也可能是派生类的对象。这被称作向上强制转换。但向下强制转换是不允许的,因为is-a关系通常不可逆。