C++ primer 查漏补缺四:引用

声明

一条简单的声明语句由一个数据类型和紧随其后的一个变量名列表组成。

其实更通用的描述是,一条声明语句由一个基本数据类型(base type)和紧随其后的一个声明符(declarator)列表组成。
每个
声明符
命名了一个变量并指定该变量为与基本数据类型有关的某种类型。

之前,我们所接触的声明语句中,声明符其实就是变量名,此时变量的类型也就是声明的基本数据类型。

引用

引用(reference)为对象起了另外一个名字,引用类型引用(refers to)另外一种类型。
通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量名:

int d =1024;
int &refd = d;
int &refd2;   //报错 引用必须初始化

一般在初始化变量时,初始值会被拷贝到新建的对象中。
然而定义引用时,程序把引用和它的初始值绑定(bind)在一起,而不是将初始值拷贝给引用。一旦初始化完成,引用将和它的初始值对象一直绑定在一起。因为无法令引用重新绑定到另外一个对象,因此引用必须初始化。

引用并非对象,相反的,它只是为一个已经存在的对象所起的另外一个名字

为引用赋值,实际上是把值赋给了与引用绑定的对象。
获取引用的值,实际上是获取了与引用绑定的对象的值。
以引用作为初始值,实际上是以与引用绑定的对象作为初始值

引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起

引用的类型都要和与之绑定的对象严格匹配(两种例外情况)。
在这里插入图片描述

例外1:
可以把引用绑定到cost对象上,就像绑定到其他对象上一样,我们称之为对常量的引用(reference to const)。
与普通引用不同的是,对常量的引用不能被用作修改它所绑定的对象:.

const int ci  = 1024;
const int &r1 =  ci; //对的
r1  = 42 ; // 错误 r1是对常量的引用,不能修改它所绑定的值
int &r2 = ci; //错误:试图让一个非常量引用指向一个常量引用

第一种例外情况就是在初始化常量引用时允许用任意表达式作为初始值,只要该表达式的结果能转换成(参见2.1.2节,第32页)引用的类型即可。尤其,允许为一个常量引用绑定非常量的对象、字面值,甚至是个一般表达式:

C++ primer 查漏补缺四:引用_第1张图片

存在继承关系的类是一个重要的例外:我们可以将基类的指针或引用绑定到派生类对象上。例如,我们可以用Quote.&
指向一个Bulk quote对象,也可以把一个Bulk quote对象的地址赋给一个Quote*。可以将基类的指针或引用绑定到派生类对象上有一层极为重要的含义:当使用基类的引用(或指针)时,实际上我们并不清楚该引用(或指针)所绑定对象的真实类型。该对
象可能是基类的对象,也可能是派生类的对象。

你可能感兴趣的:(C++查漏补缺,c++,开发语言)