复合类型是指基于其他类型定义的类型。C++中有几种复合类型,本文介绍其中一种:引用。
一条声明语句有一个基本数据类型(base type)和紧跟其后的一个声明符(declarator)列表组成。每个声明符命名了一个变量并指定该变量为与基本数据类型有关的某种类型。
一 引用的概念
引用为对象起了另外一个名字,引用类型引用另外一种类型。通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量名:
int a=123;
int &b=a; //b指向a(b是a的别名)
int &c; //错误:引用必须初始化
一般在初始化变量时,初始值会被拷贝到新创建的对象中。但是,定义引用时,程序将引用和它的初始值绑定在一起,而非将初始值拷贝给引用。
一旦初始化完成,引用将和其初始值对象一直绑定在一起,也正因此,我们无法令引用重新绑定到另外一个对象。即,引用必须初始化。
二 引用即别名
引用并对象,相反的,它只是一个已经存在的对象所起的另外一个名字。
在定义了一个引用之后,对其进行的操作都是在与之绑定的对象上进行的:
int a=1;
int &b=a;
b=2; //将2赋值给b所指向的对象,此处即是赋值给了a
int c=b; //与c=a的指向结果一致
为引用赋值,即将值赋给了与该引用绑定的对象。获取引用的值,即获取了与该引用绑定的对象的值。同理,以引用作为初始值,实际上是以引用绑定的对象作为初始值:
int a=1;
int &b=a;
int &c=b; //将c绑定到b所绑定的对象上,即a
int c=b; //将i初始化为b所绑定的对象的值,即a的值
不难发现,引用本身不是一个对象,所以不能定义引用的引用。
三 引用的定义
允许在一条语句中定义多个引用,其中每个引用标识符都必须以符号&开头。正常情况下,引用的类型要和与之绑定的对象严格匹配。而且,引用只能绑定在对象上,不能和字面值或者某个表达式的计算结果绑定在一起。
int a1=1 , a2=2; //a1和a2都是int类型
int &b1=a1 , b2=a2; //b1是一个引用,绑定在a1上;b2是int类型
int a3=3 , &b3=a3; //a3是int,b3是一个引用,绑定在a3上
int &a4 = 10; //错误,引用类型的初始值必须是一个对象
double dbVal = 3.14;
int &intVal = dbVal; //错误,此处引用类型的初始值必须是int型对象
四 引用的特性
- 引用在定义时是必须初始化
- 一个变量可以有多个引用
- 引用一旦引用一个实体,再不能引用其他实体,只是改变值而言。