先用一个比较接近的词来描述关键字const的含义:“只读”。
以下从修饰变量、函数、类三个角度进行分析与总结。
修饰变量:
1)const一般变量:
const int value = 10;这是“C Primer Plus”中讲到的三种创建符号常量方法之一,另外两种是宏定义和枚举。
define宏定义的符号常量是明显常量,在编译时会直接用实际的值代替,在程序运行时所有的替代都已经完成。
a.能够明确指定类型,可用于复杂/自定义的数据类型
b.有了第一条,const可以做类型安全检查,而宏定义不行
c.可将定义限定在特定的函数内或文件中
d.可以对const常量进行调试(实实在在的变量),不能对宏进行调试
a.常量指针(常指针):
int* const p = &a;
同上面一样,定义时必须赋初值,变量p的值不能修改,即定义后不能指向其他变量,但a可以是可修改的;
b.指针常量:
int a=2,b;
const int *p2;
p2 = &a;
//*p2 = 20;
a = 20;
p2 = &b;
指针所保存的地址可以改变,但指针所指向的值却不可以通过该指针改变。当添加*p2 = 20时,会发生编译错误!(*p2 不能修改)
上面a不是常量,可以修改;p2是可以指向其他变量的。
这种用法是很常见的,其微妙之处在于指针只用来取值,不用来修改!常将这种方法用于向函数传递数组、字符串、类对象等参数。
c.当然了,还可以有:
int a = 0;
const int * const p = &a;;
p是指向常量的常指针,即不能修改p的值,也不能通过p修改值,很好理解,没什么必要记。
3)const修饰全局变量
这个也是需要提一下的。
C语言中:外部链接,存放在只读数据段(.rdata)
C++中:内部链接,它可以被编译器放到符号表中作为编译期常量,(注意“可以”两个字,在该符号出现的某些地方,直接用常量代替),默认是不会进入导出符号表。
因此,在C++中,const会改变全局变量默认的作用域,使其仅在文件内有效;