C++中的const
1. 类型限定符
根据《C语言参考手册》4.4.3中的说明:
类型限定符指定了类型的额外属性,只有当通过左值(指示符)访问具有限定符的对象时,这些限定符才发挥作用。
当限定符在需要一个值而不是一个指示符的上下文环境中使用时,该限定符就不会对类型产生任何影响。也就是说,在表达式L=R
中,
=
操作符的右操作数的类型总是非限定版本的,即使它在声明时使用了类型限定符。
但是,左操作数仍然保持它的限定性,因为它是作为左值使用的。
具有const
限定类型的左值表达式的值无法被修改。
const int ic = 37; // ic是一个整型常量
ic = 5; // invalid
ic++; // invalid
int *const p1; // p是一个常量指针,p的地址不能改变,但可以修改它所指向/引用的对象
int var = 20;
p1 = &var;
*p1 = 123; // OK, p1可以修改它所引用的对象
p1++; // invalid, p1的地址不能改变
const int *p2; // p是一个 "指向常量的指针", p指向的内容不能改变,
// p本身可以改变(即指针本身不是常量)
int c1=10;
const int c2=20;
p2 = &c2; // OK.
p2 = &c1; // OK.
2. C++中
在C++
中,除了兼容C
的用法外,还多了许多其它的规则。
const
可以作用在对象上,const
对象一旦创建后其值不能被改变- 只能在
const
类型的对象上执行不改变其内容的操作 - 默认情况下,
const
对象仅在文件内有效;若要在多个文件之间共享const
对象,必须在变量定义之前加上extern
关键字 - 可以把引用绑定到
const
对象上,称之为 对常量的引用;对常量的引用,本质上是对const
的引用
3. 顶层 const
和底层 const
- 顶层
const
表示指针本身是个常量 - 底层
const
表示指针所指向的对象是个常量
更一般地,顶层 const
可以表示任意的对象是常量。