c++ 中const常量的事情

const介绍

const是c++语言中的保留字,作用是将变量转为常量,常量是一旦赋值过后是改变不了的量,并且常量是必须在声明的时候就初始化。
例如:

1
2
3
const int x = 10;
x = 20;
cout << x << endl; //发现打印的还是10

我们可以发现给x重新赋值后,x存储的值依然是原来的值。

全局常量和局部常量的区别

const修饰的变量真的不能改变吗?

常量真的是不能改变的吗?我们科以使用指针的方法来试一下能否改变。

1
2
3
4
const int x = 10;
int *p = const_cast<int *>(&x);
*p = 20;
cout << x << endl; //打印的还是10

由此我们可以知道指针并不能改变常量的值。但是真的是这样吗?我在百度上面查了后才知道,这只是针对基本数据类型才会是这样的,如果我们使用自定义类型,使用指针的方式
还是能够改变值的,这是因为编译器在编译代码的时候,发现常量后会自动优化代码,将常量直接替换成值,而不是常量符号,这样我们在运行代码无论如何也改变不了使用常量的
时候的值。但是由于自定义类型,编译器并不确定这种类型,所以无法替换,也就可以改变值。

1
2
3
4
5
6
7
8
9
10
11
struct T
{
int a;
int b;
};
const T x = {1,2};
cout << x.a <<","<< x.b << endl; //输出 1,2
T *p = const_cast<T *>(&x);
p->a = 10;
p->b = 20;
cout << x.a <<","<< x.b << endl; //输出 10,20

const_cast 解析

const_cast转换符是用来移除变量的const或volatile限定符。为什么要去掉const呢?因为在指针变量赋值常量地址的时候,编译器是不允许这样操作的,但是我们恰好就是想要这
么做,const_cast就可以这样去掉const修饰符,引用也是如此。