复合类型之一 引用

总:复合类型

复合类型是基于其他类型定义的类型,这里介绍两种复合类型 引用与指针,今天先看引用,指针见下一篇

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;


例外二:

存在继承关系的类:此处见后来博文:


原文地址:https://www.cnblogs.com/melons/p/5791886.html