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修饰,但它还是一个变量。