因为有了const,所以当我们的程序中有多处需要一个常量时,我们可以使用const定义常量,而舍弃不好追踪的#define。而使用const定义的变量,它仍然是变量,只是不允许对其修改了。既然它是一个变量,一个实体,那我们就能够定义它的引用。好的,我们用如下代码对它及其引用进行定义:
const int value = 0;
int &refValue = value;
编译一下,我们发现,编译器报错了!编译器告诉我们,用const int类型来初始化int&是无效的。为何?我们来做个简单的分析吧:我们将value定义为const int,旨在防止代码中无意的修改造成某些不可预见的错误。随后,我们为value定义了引用并初始化其引用,此刻,我们就可以说refValue绑定于value之上(假定这是合法的)。上一文中提到过,对于引用的合法操作,都将反映到其所指的对象之上,既如此,那因为我们定义的引用是非const引用,我们就可以对refValue进行修改了!但是refValue指向了一个const对象,const对象不允许被修改!由此,我们就可以得出结论,不能用一个const对象来初始化一个非const引用!
int value = 0;
const int &refValue = value;
cout << refValue << endl;
value = 10;
cout << value << endl;
cout << refValue << endl;
我们再输入以上代码,编译,正常运行。得到0 10 10。分析上述代码:我们以一个int型变量初始化一个const引用,编译通过,这是合法的。然后我们对value进行了修改,再对value和refValue进行打印,得到10 10。
综上,我们可以得出结论:const引用对其指向的对象是否为const对象并不在意,但const对象的引用必须为const引用。最后再提一点,普通引用不可以指向字面值常量,但const引用可以指向字面值常量(原因比较明显,对于一个字面值常量,当然不能修改其值,const引用明显较为符合这点)。