作为c++中的一个关键字,你可以在很多地方看到const的身影,下面我们来举几个例子:
1.将某变量定义成常量
const int bufSize = 512;
首先我们声明了一个名为bufSize的整型变量,同时观察到在最左侧我们使用了const限定符将该整型变量bufSize定义成了一个常量。
因此,任何试图改变bufSize的值的行为都将引发错误。与此同时,由于const对象一旦创建之后它的值就不能再改变,const对象必须初始化。
2.对常量的引用
const int& r1 = bufSize;
在这段代码中,int& r1 = bufSize; 表明了r1是一个整型引用并且r1与常量bufSize进行了绑定。这时左侧的const对该引用进行了限制,表明r1是一个对常量的引用。
对常量的引用与普通引用最大的不同点就是:对常量的引用不能被用作修改它所绑定的对象。下面我为大家介绍的两句话几乎能概括对常量的引用的最大特点:
(1)不能用一个非常量引用绑定一个常量对象
让我们试着以这样的角度去理解: 当你手上有一个常量对象,顾名思义该常量对象的值是不能被改变的,这时候如果你需要用一个引用去绑定该常量对象(当然是为了方便使用),那么你面临着两种选择,使用常量引用或者非常量引用。这时候如果你选择了使用非常量引用,那么你会发现产生了歧义。首先通过对引用的了解我们知道,引用和被引用绑定的对象其实是一回事,引用只是被绑定对象的一个别名,那么这时候如果我们修改了引用的值会怎么样?毫无疑问被引用绑定的那个常量的值也应该被修改,然而不是说了常量的值不能被修改吗?因此这时候我们应该选择使用常量引用绑定常量对象。
(2)常量引用是对const的引用
严格来说并不存在常量引用。因为引用不是一个对象,所以我们没办法让引用本身恒定不变。因此我们可以把“对常量的引用”看成是一个底层const。
3.指向常量的指针
const double pi = 3.14;
const double *cptr = π
指向常量的指针表明指针所指的对象为一个常量,因此不能通过指针去修改所指对象的内容,但指针的指向可以发生改变 。
4. (指向变量的)常量指针
int errNumb = 0;
int *const curErr = &errNumb;
指向变量的常量指针表明所指的对象为变量,但指针本身为常量,因此我们虽然能通过指针改变所指对象的值,但我们却不能改变指针的指向。
(指向常量的)常量指针
const double pi = 3.14159;
const double *const pip = π
指向常量的常量指针表明指针和指针所指的对象均为常量,因此无论是改变指针指向或是通过指针改变指针所指对象的值都是不被允许的。
顶层const
就像上面所说的那样,对于指针这种本身是一个对象,同时又可以指向另外一个对象(引用本身不是对象,但可以指向另外一个对象)的类型,我们用名词顶层const表示指针本身是一个常量,用名词底层const表示指针所指的对象是一个常量。
const int ci = 42;
const int *p2 = &ci;
const int *const p3 = p2; //靠右的const为顶层const,靠左的const为底层const
总结来说:
(1)const修饰算术类型(均为顶层const)
对象的值(内容)不可改变,自然也就不能重新赋值
(2)const修饰引用(均为底层const)
引用所绑定的对象的值(内容)不可改变,同时我们需要注意到,引用本身并不是一个对象,因此不存在对引用的顶层const
(3)const修饰指针(顶层const和底层const均有)
见上文