引用
引用是为对象起了另外一个名字,一般是指左值引用;引用必须初始化,一旦初始化完成,引用将和他的初始值对象一直绑定在一起,无法令引用重新绑定到另外一个对象。
int ival = 1024;
int &refVal = ival; // refVal是ival的另一个名字
int &refVal2; // 错误,引用必须初始化
int refVal3 = refVal // 正确,与绑定到ival相同
初始化时,引用的类型都要和与之绑定的对象严格匹配,赋值时则不必,而且引用不能绑定到字面值:
int &refVal4 = 10; // 错误,引用初始值必须是一个对象
double dval = 3.14;
int &refVal5 = dval; // 错误,类型不匹配
int i = 0, &r1 = i;
double d = 0, &r2 = d;
r2 = 3.14;
r2 = r1; // 正确,r2=0,执行了类型转换
i = r2; // 正确,i=0,执行了类型转换
r1 = d; // 正确,r1=d,执行了类型转换
指针
把int变量直接赋值给指针是错误的操作,即使int变量的值恰好等于0也不行。
int zero = 0;
int *p = zero; // 错误,不能把int值直接赋值给指针
void *指针可以存放任意对象的地址,但不能直接操作void *指针所指的对象,因为不知道对象类型是什么。
指向指针的引用
引用本身不是一个对象,因此不能定义一个指向引用的指针。但指针是对象,可以存在对指针的引用:
int i = 42;
int *p; // p是指向int型的指针
int *&r = p; // r是一个指向p的引用
r = &i; // i的地址赋值给r,相当于指针p指向变量i
*r = 0; // 对r解引用得到i,即将i赋值为0
要理解r的类型到底是什么,最简单的方法是从左到右阅读r的定义。离变量名最近的符号对变量的类型有最直接的影响,因此r是一个引用。声明符的其余部分用以确定r引用的类型是什么,此例中符号*说明r引用的是一个指针。