const_cast 是 C++ 中四种命名的强制类型转换之一(另外三种是 static_cast、dynamic_cast 和 reinterpret_cast)。它的唯一职责是添加或移除变量的 const(或 volatile)限定符。它不能改变对象的类型,也不能做其他任何转换。
语法
const_cast<new_type>(expression)
其中 new_type 必须是指针或引用类型,且与 expression 的类型在去除 const/volatile 后必须一致。
主要用途
-
移除 const(最常见):将 const T* 转为 T*,或 const T& 转为 T&,从而允许修改原本只读的对象(但前提是对象本身不是常量)。
-
添加 const(较少用):将 T* 转为 const T*,或 T& 转为 const T&,用于重载决议或接口适配。
重要注意事项
-
未定义行为(UB):如果用 const_cast 移除一个真正 const 对象的常量性并试图修改它,则行为是未定义的(程序可能崩溃或产生不可预测结果)。只有当一个对象本身不是 const(例如栈上的非 const 变量),但被一个 const 指针或引用指向时,才可以通过 const_cast 安全地修改它。
-
只能用于指针或引用:不能直接对对象本身使用,只能对指针或引用。
-
不能改变底层类型:例如不能将 int* 转为 char*,那是 reinterpret_cast 的工作。
-
风险提示:滥用 const_cast 会破坏 const 正确性,增加代码维护难度。它通常用于与遗留 C 库交互,或解决设计上的妥协,应尽量避免。
例子1: 安全使用
#include <iostream>
int main() {
int value = 42; // 非 const 对象
const int* const_ptr = &value; // const 指针指向它
// 通过 const_cast 移除 const,得到可修改的指针
int* mutable_ptr = const_cast<int*>(const_ptr);
*mutable_ptr = 100; // 安全,因为 value 本身不是 const
std::cout << "value = " << value << std::endl; // 输出 100
return 0;
}
例子2:不安全使用(对象本身是常量)
#include <iostream>
int main() {
const int const_value = 42; // 真正的 const 对象
const int* const_ptr = &const_value;
// 移除 const 并尝试修改
int* mutable_ptr = const_cast<int*>(const_ptr);
*mutable_ptr = 100; // 未定义行为!可能崩溃
std::cout << "const_value = " << const_value << std::endl; // 可能输出 42 或 100,或崩溃
return 0;
}
例子3:添加 const 的例子(少见)
#include <iostream>
void print(const int* p) {
std::cout << *p << std::endl;
}
int main() {
int value = 42;
int* p = &value;
// 添加 const,使非常量指针可以传递给期望 const 指针的函数
print(const_cast<const int*>(p)); // 也可以隐式转换,此处仅演示
return 0;
}
网硕互联帮助中心

![第5章,[Win32 章节] :绘制填充区域-网硕互联帮助中心](https://www.wsisp.com/helps/wp-content/uploads/2026/08/20260828170845-6a91c09d7e3b9-220x150.png)

评论前必须登录!
注册