C语言与C++语言中Const的特性剖析

Const的本质

对于C++中的变量来说

#include <iostream>  
using namespace std;  
  
int main()  
{  
    const int var2 = 10;  
    int *p = (int*)&var2;  
    *p = 20;  
    cout << var2 << endl; // 不可以通过*p来修改a的值  
}  

我们看到了,C++中的const限制了来自“从变量本身改变变量的值与从变量指针强制改变变量的值”的威胁。C++中的const类型的变量真正做到了“无法被修改”的特性,被const修改的变量也因此变为了“真正的常量”。

对于C++中的常量来说

#include <iostream>  
using namespace std;  
  
int main()  
{  
    const int& temp = 10;  
  
    int var = 10;  
    const int& temp1 = var;  
  
    cout << "常量引用的地址" << &temp << endl;  
}  
// 运行结果:常量引用的地址0075FC04

Const类型的常量,会生成一个“临时储存地址”来存储该常量,因此我们可以访问该临时变量的地址。

Const在C语言中的含义

C语言中const是伪常量,可以通过强制修改const变量的指针类型,来用指针来访问修改const变量。

#include "stdio.h"  
  
int main()  
{  
    const int a = 10;  
    int* p = (int *)&a;  
    *p = 20;  
    printf("%d", *p); // 输出20  
}  

C语言中,对于const的定义仅仅是在“变量层面”起作用,而且仅仅是限制不可以通过变量本身来改变变量自身的值。

#include "stdio.h"  
  
int main()  
{  
    const int a = 10;  
    int array[a] = { 0 };  
  
    int* p = (int *)&a;  
    *p = 20;  
    printf("%d", *p); // 输出20  
}  

这样,把const变量作为数组定义时申请空间的数量会报错,因为在C语言中const无论修饰什么都会保证原有的基本属性不变,例如:如上的变量a即使有const加持,那a还是变量,和#define定义的常量不可同等对待。

因此,C++中使用const就真正表示一个常量,而C语言中虽然被const修饰,但它还是一个变量。

猜你喜欢

转载自blog.csdn.net/weixin_45590473/article/details/109260266