C++学习 第三课 进化后的 const 分析 ---- (狄泰软件学院)

C语言中的 const

const 修饰的变量是只读的, 本质上还是变量

const 修饰的局部变量在栈上分配空间

const 修饰的全局变量在只读存储区分配空间

const 只在编译器有用在运行期无用

const 修饰的变量不是真正的常量,它只是告诉编译器该变量不能出现在赋值符号的左边

C语言中的 const 使得变量具有只读属性

const 将具有全局生命周期的变量存储于只读存储区

const 不能定义真正意义上的常量!

 

C++中的 const

C++在C的基础上对 const 进行了优化处理

当碰见 const 声明时在符号表中放入常量

编译过程中若发现使用常量则直接以符号表中的值替换

编译过程中若发现下述情况则给对应的常量分配存储空间

对 const 常量使用了 extern,给对应的常量分配存储空间

对 const 常量使用 & 操作符,给对应的常量分配存储空间

注意:C++编译器虽然可能为 const 常量分配空间, 但不会使用其存储空间中的值。

C++学习 第三课 进化后的 const 分析 ---- (狄泰软件学院)_第1张图片

C语言中的 const 变量

C语言中 const 变量是只读变量, 会分配存储空间

C++中的 const 常量可能会分配空间

当 const 常量为全局, 并且需要在其他文件中使用(extern)

当使用 & 操作符对 const 常量取地址

#include 

int main()
{
    const int c = 0;     
    int* p = (int*)&c;
    
    printf("Begin...\n");
    
    *p = 5;
    
    printf("c = %d\n", c);
    
    printf("End...\n");
    
    return 0;
}

上述代码中:const int c = 0; 在C++中当 c 为外部文件使用 或 对 c 使用 & 操作符时会为 c 分配空间,但是不会去使用这片空间,const 修饰的 c 在编译器编译时会产生符号表, 当使用 c 时会从中取值使用,并不会去使用为 c 开辟的空间, 所以在C++中 const 修饰的变量是真正意义上的常量。

C++中打印结果为 :0 5

 

C++中的 const 常量类似于宏定义

const int c = 5;#define c 5

C++中的 const 常量与宏定义不同

const 常量是由编译器处理

编译器对 const 常量进行类型检查和作用域检查

宏定义由预处理器处理 单纯的文本替换,-- 由于是预处理器处理,编译器在编译期间不会对其进行作用域检查和类型检查

#include

void f()
{
    #define a 3
    const int b = 4;
}

void g()
{
    printf("a = %d\n", a);
    //printf("b = %d\n", b);
}

int main()
{
    const int A = 1;
    const int B = 2;
    int array[A + B] = {0};
    int i = 0;
    
    for(i=0; i<(A + B); i++)
    {
        printf("array[%d] = %d\n", i, array[i]);
    }
    
    f();
    g();
    
    return 0;
}

上述代码中 : #define 没有作用域概念,只是单纯的文本替换,所以在f()函数中定义能在g()函数中使用,const则不行,这就是两者的区别;

在C语言中 const修饰的局部变量是伪常量所以不能用于定义数组的大小,而在C++中则是真正意义上的常量。

 

小结

与C语言不同, C++中的 const 不是只读变量

C++中的 const 是一个真正意义上的常量

C++编译器可能会为 const 常量分配空间

C++完全兼容C语言中的 const 常量的语法特性

 

 

你可能感兴趣的:(C学习(狄泰软件学院),c++)