const关键字来源自constant,即是“常数、常量”的含义。在C/C++中,用于限定一个不能改变其值的变量。const类型的对象必须在定义的时候进行初始化(可以在编译时或者在运行时),并且一旦初始化完成后,这个值就不能再被改变。通常情况下,const对象的有效范围是当前文件;如果多个文件中出现了同名的const变量,则认为是每个文件中都定义了不同的变量。如果希望在多个文件中共享这个对象,则在声明和定义的时候添加extern关键字,指明该对象并非本文件独有,可能被其他文件使用。
const引用:
对于一个const变量,也一样可以对其定义一个引用。我们知道,C++不允许随意改变某个引用所绑定的对象,因此一个对const对象引用不论是引用对应对象还是这个对象的值都不能改变,所以对于const对象的引用也可以称之为“常量引用”。由此带来的一个要求就是,指向该const对象的引用也必须是const类型,如:
const int ci = 1024; const int &r1 = ci;//正确,const引用对应const对象 int &r2 = ci;//错误,如r2不是const类型
定义一个const引用可以绑定一个非const的值,但是不允许通过该引用修改这个值,如:
int a = 10; const int &r1 = a; r1 = 15;//错误,不允许通过const引用修改对象的值 a = 15;//正确
const和指针:
const与指针的关系相对于引用要复杂一些,因为涉及到指向常量的指针和自身是常量的指针两种关系。两者的区别如下:
int errNum = 0; int *const pNum = &errNum;//指针变量本身是常量 const double pi = 3.14159; const double *pPi1 = Π//指针指向的目标可变,但是必须是const对象 const double *const pPi2 = Π//常量指针,指向常量对象 double *const pPi3 = Π//错误,指向常量的指针必须前置const修饰
如何区别呢?简单地看,最前面的const表示指针所指向的是一个const对象,而*后面的const表示指针不能指向其他的对象,也就是指针本身是const类型的。 这两者也分别被称作底层const和顶层const。如果某个对象是const型,那指向这个对象的指针也必须以const定义在最前面。