C++ const_cast解释

今天看到C++类型转换,遇到一些问题,于是上网查了一些资料 做了一些总结.#include<iostream> using namespace std; struct A{ int data; }; int main(void){ const A a={200}; //A a1=const_cast<A>(a); //a1.data=300; //目标类型只能是指针或者引用 所以上述代码会出现错误! A &a2=const_cast<A&>(a); a2.data=300; cout<<a.data<<","<<a2.data<<endl; cout<<&a<<","<<&a2<<endl; A*a3=const_cast<A*>(&a); a3->data=400; cout<<a.data<<","<<a3->data<<endl; cout<<&a<<","<<a3<<endl; const int x=3; int &x1=const_cast<int&>(x); x1=300; cout<<x<<","<<x1<<endl; cout<<&x<<","<<&x1<<endl; int *x2=const_cast<int*>(&x); *x2=400; cout<<x<<","<<*x2<<endl; cout<<&x<<","<<x2<<endl; return 0; } 输出300,300
0x7ffea2d148d0,0x7ffea2d148d0
400,400
0x7ffea2d148d0,0x7ffea2d148d0
3,300
0x7ffea2d148d4,0x7ffea2d148d4
3,400
0x7ffea2d148d4,0x7ffea2d148d4
分析:
对于const struct A :我们可以看到,修改后:a,a2,a3的地址是一样的 ,而且值也是一样的.
对于结构体,是存储在内存区,所对对其进行类型抓换成指针或者引用 ,都是对内存中同一块地址进行操作,所以值也是一样的
但是对于
const int x=3;
x,x1,x2,地址是一样的 但是值确实不一样的
x不是 const 常量的真正内存,只是一份在寄存器的拷贝, 不允许改变的拷贝。但是,缺点就是如果 const 变量经过一些方式被改变了,寄存器中的拷贝就会有 “延迟” 。
但是 const_cast 并没有改变 const 变量的 const 属性,改变的只是原始声明 const int x = 3中,x 地址指向的内存。 const 属性和 x 都被翻译成机器的代码了,可执行程序是不可变的,其中的 const x 是已经确定了的,的确存在于寄存器中,和原来的内存没有关系了

猜你喜欢

转载自blog.csdn.net/Zyong139064359/article/details/88816733
今日推荐