引用,指针与const
一、引用(严格来说这里指的是“左值引用”)
两条规则:
(1)定义引用时,程序会把引用和它的初始值对象一直绑定(bind)在一起
(2)引用绑定了一个对象后不能重新绑定到另一个对象
规则(1),与拷贝不同,引用和对象绑定后,改变其中一个,另一个也会跟着改变。换而言之,引用是为一个已经存在的一个对象起的另一个名字(注意引用本身并非对象,引用即别名),所以引用只能绑定对象不能绑定字面值或者表达式的计算结果。例如,小明的别名叫小胖,叫小明起床,小明起床了,意味着小胖也起床了,小明和小胖是一回事。
int ivalue = 1;
int &ref1 = ivalue;
cout << ref1 << endl; //1
ref1 = 2;
cout << ivalue << endl; //2
ivalue = 3;
cout << ref1 << endl; //3
int &ref2 = 10; //错误,引用只能绑定对象不能绑定字面值或者表达式的计算结果```
规则(2),引用绑定了一个对象后不能重新绑定到另一个对象,意味着在引用定义后不能再出现&ref1=XXX的赋值语句(注意区分&ref1=XXX和ref1=XXX),如果引用在定义时不初始化引用,那么这个引用永远都不能初始化了,因此引用在定义时必须初始化。
int &ref3; //错误,引用在定义时必须初始化
再来看看下面的例子:
double dvalue = 3.14;
int &ref4 = dvalue; //错误,此处引用的初始值必须是int对象
上述这个例子中,编译器为了让ref4绑定一个int类型的数,会做这样的处理:
int temp = dvalue;
int &ref4 = temp;
这样ref4绑定的是一个临时量而非dvalue,那么改变ref4的值改变的也不是dvalue的值,那么定义ref4这个引用毫无作用也毫无意义,C++也把这种行为定为非法。