--事物的难度远远低于对事物的恐惧!
对于const关键字,在C进阶分析中,我们知道,const在C语言中有如下特性:
-const修饰的变量是只读的,其本质还是变量而,也就是只读变量(依旧可以通过别的手段修改const变量)
-const修饰的局部变量在栈上分配空间
-const修饰的全局变量或静态局部变量,在只读存储区分配空间
-const只在编译期有用,在运行期无用
在C语言中,const不能定义真正意义上的常量!
下边通过一个小例子先来初步感受下C与C++中,const的区别
#include<stdio.h> int main() { const int i = 0; int *p = (int *)&i; *p = 5; printf("i = %d\n", i); return 0; }首先采用gcc编译器来编译,输出结果如下:
可以看到,我们用const修饰的变量i,值已经被改了,这说明C语言中的const并不能修饰为常量。
我们现在用g++来编译运行,输出结果为:
从输出看到,在C++中,const修饰的i,并不会像在C中的那样被修改。
其实在C++中,C++是在C的基础上对const进行了进化处理
-当碰见const声明时,就把声明的标识符当做常量放入符号表中
-编译过程中若发现使用常量则以符号表中的值替换
-编译过程中若对const常量使用了extern或&操作符,那么还是会给对应的常量分配存储空间。
注意:C++虽然可能为const常量分配空间,但是不会使用其存储空间中的值,仅仅是为了兼容C语言
上边的*p = 5;其实是使用了给c分配的空间赋值为5,但是C时不会去使用这个分配的空间的,在C出现的地方,会以符号表中的值去替代。
C++中的const常量类似于宏定义
-const int c = 5; ≈ #define c 5
但是实际上const常量与宏还是有区别的
-const常量由编译器处理
-编译器对const常量进行类型检查和作用域检查
-宏定义由预处理器处理,仅仅是单纯的文本替换
总结:
-C语言中的const修饰的只是只读变量
-C++中的const修饰的是真正意义上的常量
-C++编译器可能会为const常量分配空间,但是并不会去使用这个分配的空间,仅仅是为了兼容C语言
-C++完全兼容C语言中const的语法特性