const变量
const又叫做const限定符,用关键字const对变量的类型加以限定,可以使得变量的值不能被改变。
|
|
没有初始化的常量变量编译错误其实很好理解,因为经过const限定之后变量的值已经无法改变,如果没有初始化那么这个变量的值不确定,且之后其值不能被改变。
const引用
const引用称为对常量的引用,简称为“常量引用”,顾名思义,就是这个对象是一个引用,而且这个对象经过const限定符作用之后,对象的值不能被改变。
如上所示,常量引用r1,r2是一个常量,而同时,因为const的限制,r1和r2的值不能改变,所以通过r1和r2修改c1和c2的值也就不可能,但是c2因为没有const的限制,可以通过c2修改自身的值。
引用的类型必须与其引用对象的类型一致,但存在例外。一种则是允许常量引用绑定一个非常量的对象,但是不能通过该常量引用改变绑定对象的值,此种情况上面已经出现,不在赘述。另一种是在初始化常量引用时允许用任意表达式作为初始值,只要该表达式的结果能转化为引用的类型即可。
上述代码是合法的操作c
机制是
也就是先将dval转化为整型,注意,其中的temp是临时量,所谓临时量对象就是当编译器需要一个空间来暂存表达式的求值结果临时创建的一个未命名的对象。
而如果ri不是常量,即:
此时编译器会报错,错误如下:
指针和const
与引用一样,也可以令指针指向常量或非常量,类似于常量引用,指向常量的指针(不是常量指针)不能用于改变其所指对象的值。要想存放常量对象的地址,只能使用指向常量的指针:
同样,指针的类型必须与其所指对象的类型一致,但是与引用一样,存在例外,允许一个指向常量的指针指向一个非常量的对象:
指针是对象而引用不是,所以允许把指针本身定为常量。常量指针必须初始化,一旦初始化完成,则指针的值不能被修改。
将号放在const关键字之前用以说明指针是一个常量,不变的是指针本身的值而非指向的那个值。
从右向左阅读解析,如上面代码第二行中,离curErr最近的符号是const,意味着curErr本身是一个常量对象,对象的类型由声明符的其余部分确定。声明符中的下一个符号是,意思是curErr是一个常量指针。最后,声明语句的基本数据类型部分确定了常量指针指向的是一个int对象。同理,我们可以看出pip是一个常量指针,指向的对象是一个双精度浮点型常量。
指向常量的指针和常量指针的对比
指向常量的指针是指指针指向的值是一个常量(存在上述的例外),这就说明指针的值是可以被改变的,而常量指针是指指针本身是一个常量,但是指针指向的值不一定是常量。
顶层const
指针本身是不是常量以及指针所指的是不是一个常量是两个相互独立的问题。用名词顶层const(top-level const)表示指针本身是个常量,而用名词底层const(low-level const)表示指针所指的对象是一个常量。
更一般的,顶层const可以表示任意的对象是常量,这一点对任何数据类型都适用;底层const则与指针和引用等复合类型的基本类型部分有关。
常量表达式
常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式。
一个对象(或表达式)是不是常量表达式由它的数据类型和初始值共同决定,例如: