C++小白到大白养成记 - 养成记3:进化后的const分析

--事物的难度远远低于对事物的恐惧!

    对于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的语法特性

猜你喜欢

转载自blog.csdn.net/lms1008611/article/details/80552108