2.3复合类型变量
复合类型是指基于其他类型定义的类型,本章主要介绍指针和引用,其中指针是重点和难点,要学会区分指针和引用的不同。
语句模板:一条声明语句由一个基本数据类型和紧随其后的一个声明符列表组成。
每个声明符命名了一个变量并指定该变量与基本数据类型有关的某种类型。
2.3.1引用(reference)
C++11中新增了”右值引用“,将在后面13.6.1节介绍;这里主要介绍,左值引用。
引用为对象起了另外一个名字,引用类型引用另外一种类型。通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量名。
int ival=1024;
int &refval=ival;//refval指向ival(是ival的另一个名字,可以想成人的外号)
int &refval2; //错误:引用必须初始化
一般在初始化变量时,初始值会被拷贝到新建的对象中。然而定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。一旦初始化完成,引用将和他的初始值对象一直绑定在一起。因为无法另引用重新绑定到另外一个对象,因此引用必须初始化。
引用并非对象,不占用内存空间,它只是为一个已经存在的对象起了一个”外号“
对引用的所有操作都是在与子绑定的对象上进行的。
int refval=2;//把2赋给refval指向的对象,此处即是赋给了refval绑定的对象ival
int ii=refval;//与ii=ival执行结果一样
为引用赋值,实际上是把值赋给了与引用绑定的对象上。
获取引用的值,实际上获取了与引用绑定的对象的值。
int &refval3=refval;
//正确:refval3绑定到了那个与refval绑定的对象上,这里就是绑定到了ival上
上面代码可想成是链式引用,而不是引用的引用。
因为引用本身不是一个对象,所以不能定义应用的引用,即不能出现int &&ref=ival;的情况!后来指针可以出现 int **p=&val;即指针的指针
引用的定义
int i=1024,&i2=i;//i是int型变量,i2是i的一个引用
除了与const结合时(primer中文版55页和534页)例外,引用的类型必须和绑定的对象类型严格匹配。且引用只能绑定到对象上,而不能与字面值或某个表达式的计算结果绑定在一起,原因后面文章解释。
解释链接
int &refval4=10;//错误:引用类型的初始值必须是一个对象
double dval=3.14;
int &refval5=dval;//错误:类型不匹配
区别1
引用不是一个对象,没有引用的引用。
指针是一个对象,可以有指针的指针。