C++中强行修改const常量的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中强行修改const常量的问题相关的知识,希望对你有一定的参考价值。

1、在main函数中我声明了一个int型const常量,然后利用const_cast将指向这个const常量的指针转化成了一个非const常量的int型指针,然后对该指针所指向的地址赋值,成功将原来为10的const常量变成了9,但是下面一个利用这个const常量初始化的变量b却还是10,难道是因为编译器在编译时自动将const常量使用固定值编译的原因吗?
2、我将利用const指针和引用传递进入函数的值进行了修改之后赋给新的变量,新的变量中保存的却是修改之后的值,与main函数中不同,这个又作何解释?
3、如果我将这个int型const常量声明为全局变量,发现对其修改会导致程序崩溃,这又是为什么呢?
程序代码如下:
void test_const(const int &c_a_in)

const int *ptr_c_a = &c_a_in;
int *ptr_a = const_cast<int *>(ptr_c_a);
*ptr_a = 8;
int b = c_a_in;
cout << "test_const:" << *ptr_c_a << " " << *ptr_a << " " << b << endl;


void test_const(const int *c_a_in)

int *ptr_a = const_cast<int *>(c_a_in);
*ptr_a = 7;
int b = *c_a_in;
cout << "test_const:" << *c_a_in << " " << *ptr_a << " " << b << endl;


int main()
const int c_a = 10;
const int *ptr_c_a = &c_a;
int *ptr_a = const_cast<int *>(ptr_c_a);
*ptr_a = 9;
int b = c_a;
cout << "main:" << *ptr_c_a << " " << *ptr_a << " " << b << endl;
test_const(c_a);
test_const(&c_a);
system("pause");
return 0;

因为const变量的值正常情况下是不能修改的,所以对const变量的读取操作可以进行优化(比如:将其值保存到寄存器或者高速缓存中),导致从const变量读取的值不是来直接自于内存。所以修改const变量,其结果是无定义的。还有,有的人会将const变量的地址直接传给像scanf这样的函数,这种情况编译器不会报错,但是这样做法结果也是无定义的。

下面这个问题和你的类似:
http://zhidao.baidu.com/question/1542038595309785347
参考技术A 返回const,则调用时也必须声明为const,防止返回的指针内容被修改。

以上是关于C++中强行修改const常量的问题的主要内容,如果未能解决你的问题,请参考以下文章

C++随笔:常量指针和指针常量

c++ const总结

C++ | const修饰的变量

const关键字的使用

常量到非常量 c++

C++中加const与不加const的区别