C++的const_cast

使用总结:

规则1.使用const_cast的对象本身就是const,使用const_cast之后还是不可修改,如果修改会发生未定义错误

规则2.使用对象本身不是const,但后续因为某些原因转为const,使用const_cast之后可以修改

使用实例

1.与旧的(不完善的)API交互

cpp 复制代码
#include<iostream>
void legacy_c_function(char* str) {
    printf("String: %s\n", str);
}
int main(){

	const char* my_message = "Hello, world!";
    
    // 直接调用会报错:cannot convert 'const char*' to 'char*'
    legacy_c_function(my_message); 
    
    // 我们确信函数是安全的,所以使用const_cast
    legacy_c_function(const_cast<char*>(my_message)); // OK
}

在保证调用之后不会修改值时,可以使用const_cast,满足规则1

2.后来加上的const

cpp 复制代码
#include <iostream>

// 这个函数接受一个常量指针,但我们可能需要在一个非const的上下文中使用它
void processData(const int* ptr) {
    std::cout << "只读处理, 值为: " << *ptr << std::endl;

    // 假设我们现在需要调用一个只接受 non-const 指针的旧API
    // 并且我们100%确定这个旧API不会修改数据
    // void legacy_api(int* data);

    // 为了调用它,我们需要去掉ptr的const属性
    int* non_const_ptr = const_cast<int*>(ptr);
    
    // 我们现在可以通过 non_const_ptr 修改数据
    *non_const_ptr = 100; // 这是安全的!
}

int main() {
    int my_value = 50; // my_value 本身不是 const

    // processData 接收 const int*,所以 my_value 的地址被隐式转换为 const int*
    // 这里的 const 是"后来加上"的
    processData(&my_value); 

    // 检查 my_value 的值
    std::cout << "main函数中, my_value 的值现在是: " << my_value << std::endl;
}

因为my_value变量本身在main函数中被定义时是int,不是const int。它存储在可读写的内存区域。processData函数只是通过一个const指针"看待"它,限制了在该函数内的直接修改。我们使用const_cast只是"恢复"了它本来的可写属性。

相关推荐
Liquad Li32 分钟前
Salesforce 主流认证方式、流程、适用场景
开发语言·salesforce
LOVE️YOU4 小时前
Python 中 Tuple 为什么有时可 Hash,有时不可 Hash?
开发语言·python·哈希算法
李永奉4 小时前
C语言-指针函数与函数指针及回调函数的使用
c语言·开发语言
小oo呆4 小时前
【学习心得】迭代器和可迭代对象
开发语言·python
AC赳赳老秦4 小时前
采集行为合规自检:OpenClaw 自动校验 robots 协议与采集频率,规避违规采集风险
java·开发语言·c++·python·php·deepseek·openclaw
钱栈up4 小时前
mvn compile 卡死在 javac 阶段:一次类型不匹配的排查与修复
java·开发语言
迅猛龙办公室4 小时前
Python输出当前计算机的系统日期和时间
开发语言·前端·python
杨丰玮4185 小时前
C语言基础知识(一)————各类符号的含义与输入输出库(stdio)
c语言·开发语言
小狼154545 小时前
浏览器扩展脚本为什么有时候不生效:注入时机、iframe 和单页路由,多多开票助手
前端·chrome
じòぴé南冸じょうげん5 小时前
油猴脚本突然发现变成灰色了,无法使用?页面不生效?刷新页面没反应?
前端