在c++中,const修饰符表明“不可修改”。一般情况,指针和引用的的类型必须与其所指或所绑定的对象的类型一致。但有两个例外。其中一种就是指向常量的指针和引用。
对于引用,在初始化常量引用时,允许用任意表达式作为初始值,只要表达式的结果能够转换为引用的类型即可。例如,
int i = 42;
const int &r1 = i;
const int &r2 = r1*2;
const int &r3 =42.05;
以上都是合法的。对于指针,一个指向常量的指针可以指向一个非常量对象。例如,
double p=3.1415;
const double *ptr= &p;
以上是合法的(但要注意仍然都是double型,即基本数据类型需要保持一致)。简单的理解,所谓指向常量的指针和引用,不过是指针和引用“自以为是”罢了,它们自己觉得指向的是常量,所以不允许通过它们改变所指对象的值。
注意区分指向常量的指针和常量指针。前者不允许通过指针改变所指对象的值,但可以改变指针的值;后者不允许改变指针本身的值,但有可能可以通过指针改变所指对象的值(这要取决于所指对象是不是常量类型)。两者的声明方式也不同。
const double *ptr=&p; //指向常量的指针
double *const ptr=&p; //常量指针