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 是已经确定了的,的确存在于寄存器中,和原来的内存没有关系了

### C++ 中 `const_cast` 的用法 #### 基本概念 `const_cast` 是一种类型转换运算符,用于移除对象的常量属性或非常量属性。这允许程序将原本声明为不可修改的对象视为可修改。 #### 使用场景 当需要临时解除某个变量的只读特性以便执行某些操作时可以使用此功能。然而,在实际开发过程中应当谨慎对待这种做法,因为强行改变对象的状态可能会引发未定义行为。 #### 语法格式 ```cpp const_cast<type>(expression); ``` 其中 `<type>` 表示目标数据类型的模板参数;`(expression)` 则是要被转换表达式的括号包裹形式。 #### 实际案例分析 ##### 场景一:去除指针指向内容的 const 属性 假设有一个函数接收一个字符串作为输入并对其进行处理,但是该函数内部并不打算更改传入的数据,则通常会把形参设置成带有 `const` 关键字的形式来表明意图。如果后续又确实存在特殊情况需对该内存地址处的内容做改动的话就可以借助于 `const_cast`. ```cpp void modifyString(const char* str){ // 解除str所指字符数组上的保护机制 char *nonConstStr = const_cast<char*>(str); nonConstStr[0]='M';// 修改第一个字母为'M' } ``` 需要注意的是上述代码虽然能够编译通过但在运行期间可能导致异常情况发生因此不建议轻易尝试此类写法除非完全确认安全无虞[^1]. ##### 场景二:恢复成员函数中的 this 指针原貌 有时候类的设计者会在公有接口里加入一些额外的安全措施比如让特定方法返回带有限制条件版本的当前实例引用即所谓的“受限this”。此时为了能在私有部分继续沿用完整的权限则可通过 `const_cast` 来实现这一点. ```cpp class MyClass { public: void publicMethod() const{ privateMethod(); } private: void privateMethod(){ // 将*this由MyClass const &转回普通的MyClass& MyClass& self=const_cast<MyClass&>(*this); // 对self进行非const的操作... } }; ``` 以上就是关于 `const_cast` 在 C++ 编程语言里的主要应用方式以及注意事项介绍.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值