复合类型之一 引用
总:复合类型
复合类型是基于其他类型定义的类型,这里介绍两种复合类型 引用与指针,今天先看引用,指针见下一篇
1.1.引用(reference)
C++11中新增了一种引用:所谓的“右值引用”,主要用于内置类型,严格来说,当我们使用术语“引用”时,指的其实是“左值”引用。
引用是为对象起了另外一个名字,引用类型引用另外一种类型。假设d是声明的变量名:
int ival = 1024;
int &refVal = ival; //refVal 指向 ival (是 ival的另外一个名字);
int &refVal2; //绝对错误,引用必须要初始化;
关于为什么必须初始化:一般在初始化变量时,初始值会被拷贝到新建德尔对象中。然而定义引用时,程序把引用和它的初始值绑定在一起,而不是把初始值拷贝给引用,一旦初始化完成,引用将和它的初始值对象一直绑定在一起。因为无法令引用重新绑定到另外一个对象,因此引用必须初始化。
引用即别名:
引用并非对象,相反的,它只是一个已经存在的对象所起的另外一个名字。定义了引用之后,对其进行的所有操作都是在与之绑定的对象上进行的:
int ival = 1024;
int &refVal = ival; //refVal 指向 ival (是 ival的另外一个名字);
refVal = 2; //把2赋给refVal 指向的对象,此处就是赋给了ival;
int ii = refVal; //这和 ii = ival 等价;
为引用赋值,实际就是把值赋给了与引用绑定的对象。获取引用的值,实际是获取了与引用绑定的对象的值。同理,以引用作为初始值,实际上是以引用绑定的对象作为初始值。
引用本身不是对象,所以一定不能定义引用的引用;
引用的定义:
允许在一条语句中定义多个引用,其中每个引用都必须以&开头,引用只能绑定在对象上,而不能与字面值或者哪个表达式的结果绑定在一起:
int &refVal4 = 10; //错误,引用类型的初始值必须是一个对象
double dval = 3.14;
int &refVal = dval; //错啦,对应起来,这里引用的类型的初始值必须是 int 型
一般情况下:所有引用的类型都要和与之绑定的对象严格匹配。但是,不一般的情况下,有两种例外:
例外一:
在初始化常量引用时,允许任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可;尤其是允许为一个常量引用绑定非常量的对象、字面值,甚至是一个一般表达式:
int i = 12;
const int &r1 = i; //允许将 const int & 绑定到一个普通int 对象上;
const int &r2 = 12; //正确:r1 是一个常量引用;
const int &r3 = r1*2; // 正确:r3 是一个常量引用;
int & r4 = r1*2; //错误:r4只是一个普通的非常量引用;
当 double dval = 3.14;
const int& ri = dval; 发生了如下的转换:
const int temp = dval;
const int& ri = temp;
例外二:
存在继承关系的类:此处见后来博文: