一、引用
1、
引用就是为对象起另外一个名字。一般在初始化变量的时候,初始值会被拷贝在新建的对象当中。然而定义引用时,程序把引用和它的初始值绑定到一起,而不是将初始值拷贝给引用。
一旦初始化完成,引用将和它的初始值对象绑定在一起。因为无
法令引用重新绑定到另外一个对象,因此引用必须初始化。
int ival=1024;
int &relVal=ival; //relVal指向ival这个对象(relVal是ival的别名)
int &relVal2; //错误,引用必须被初始化
2、定义一个引用之后,对其进行的所有操作都是在与之绑定的对象上进行:
为引用赋值,实际上是把值赋给了与引用绑定的对象:
relVal=2; //把2赋给relVal指向的对象,此处即是赋给ival
获取引用的值,实际上就是获取了与引用绑定的对象的值。同理,与引用作为初值,实际上是以与引用绑定的对象作为初始值:
int ii=relVal; //与ii=ival执行结果一样
int &relVal3=relVal; //relVal3绑定到了那个与relVal绑定的对象上,这里就是绑定到ival上
3、除了两种例外情况之外,其它所有的引用类型都要和与之绑定的对象严格匹配(如类型相同等)。而且,
引用只能绑定在对象上,而不能与
字面值或某个
表达式的计算结果绑定在一起。
int &relVal4=10; //错误,引用类型的初始值必须是一个对象
double dval=10.0;
int &relVal5=dval; //错误,此处引用类型的初始值必须是int对象
二、const限定符:
1、const对象一旦创建之后,值就不能再改变,随意
const对象必须初始化。初始值可以是任意复杂的表达式:
const int i =get_size(); //运行时初始化
const int j=42; //编译时初始化
const int k; //错误,k是一个未经初始化的常量
2、初始化和const:
如果利用一个对象去初始化另外一个对象,则它们是不是const都无关紧要:
int i=42;
const int ci=i; //正确,i的值被
拷贝给了ci
int j=ci; //正确,ci的值被
拷贝给了j
三、const的引用:
1、可以把
引用绑定到const对象上,称为
对常量的引用。与普通引用不同,对常量的引用
不能被用作修改它所绑定的对象:
const int ci=1024;
const int &r1=ci; //正确,
引用及其对象都是常量,r1是对常量的引用,r1指向ci这个常量
r1=42; //错误,r1是对常量的引用
int &r2=ci; //错误,试图让一个非常量引用指向一个常量对象
2、引用的类型必须与其所引用的对象类型一致,但是有两种情况除外:
(1)、在初始化
常量引用时(const int &r )时,允许用任意表达式作为初值,只要改表达式的结果能够转换成引用的类型即可
(2)、允许一个
常量引用绑定
非常量对象、字面值、甚至是个一般表达式:
int i=42;
const int &r1=42; //允许一个
常量引用绑定字面值
const int &r2=i ; //允许一个
常量引用绑定到一个非常量对象
const int &r3=r1*2; //允许一个
常量引用绑定一般表达式
int &r4=r1*2; //错误,r4是一个普通的非常量引用