static_cast:最常用的非多态转换
static_cast 是最常用的类型转换运算符,主打非多态场景的类型转换,编译期间就会做合法性检查,能替代 C 语言中普通的类型转换。
C++ 提供四种强制类型转换运算符以增强类型安全性。static_cast 用于非多态场景的编译期检查转换,可替代 C 风格转换;reinterpret_cast 用于底层位模式重新解释,风险较高且需慎用;const_cast 专门用于移除指针或引用的 const 或 volatile 属性;dynamic_cast 依赖虚函数进行运行时多态安全转换,支持向下转换检查。不同运算符适用场景各异,开发者应根据具体需求选择以确保类型安全并避免未定义行为。

static_cast 是最常用的类型转换运算符,主打非多态场景的类型转换,编译期间就会做合法性检查,能替代 C 语言中普通的类型转换。
int 和 float 互转);void 类型;void*)与具体类型指针的转换;#include <iostream>
using namespace std;
int main() {
// 1. 基本数据类型转换
float floatNum = 3.14f;
int intNum = static_cast<int>(floatNum);
cout << "float → int: " << intNum << endl; // 输出:3(小数被截断)
intNum = 5;
floatNum = static_cast<float>(intNum);
cout << "int → float: " << floatNum << endl; // 输出:5.0
// 2. 空指针与具体指针转换
void* voidPtr = nullptr;
int* intPtr = static_cast<int*>(voidPtr);
cout << "void* → int*: " << intPtr << endl; // 输出:0(nullptr)
return 0;
}
类继承中向下转换(基类 → 派生类)时,
static_cast不做运行时检查。如果转换逻辑错误,会导致未定义行为(此时应该用dynamic_cast)。
reinterpret_cast 主打底层位模式的重新解释,它不做数据转换或类型检查,完全是按位硬转,因此风险很高,仅用于特殊底层场景。
#include <iostream>
using namespace std;
int main() {
// 1. 字符 → 整数(直接解释 ASCII 位模式)
char ch = 'A'; // 'A' 的 ASCII 码是 65
int ascii = reinterpret_cast<int&>(ch);
cout << "char → int(ASCII 值): " << ascii << endl; // 输出:65
// 2. 指针类型的底层转换(int* → float*)
int* intPtr = nullptr;
float* floatPtr = reinterpret_cast<float*>(intPtr);
cout << "int* → float*: " << floatPtr << endl; // 输出:0(与 intPtr 地址一致)
return 0;
}
reinterpret_cast完全跳过 C++ 类型系统,极易引发未定义行为,仅在硬件操作、二进制协议解析等底层场景使用。
const_cast 是专项工具——专门用于移除指针或引用的 const(或 volatile)属性,让原本被 const 限制的指针/引用能修改指向的内容。
const 属性;const 属性。#include <iostream>
using namespace std;
int main() {
int num = 100;
// 注意:若原对象本身是 const,修改会出问题,这里用非 const 变量演示
const int* constPtr = #
// 移除指针的 const 属性
int* normalPtr = const_cast<int*>(constPtr);
*normalPtr = 200;
cout << "修改后 num: " << num << endl; // 输出:200
// 移除引用的 const 属性
const int& constRef = num;
int& normalRef = const_cast<int&>(constRef);
normalRef = 300;
cout << "再次修改后 num: " << num << endl; // 输出:300
return 0;
}
如果原始对象本身声明为
const(如const int num = 100;),用const_cast移除const后再修改它,会导致未定义行为(程序可能崩溃或结果异常)。
dynamic_cast 主打多态类(含虚函数)的运行时类型检查,主要用于类继承体系中向上转换(派生 → 基类)或向下转换(基类 → 派生),保证转换的安全性。
static_cast 一致;#include <iostream>
using namespace std;
// 基类:必须包含虚函数,才能启用运行时类型识别(RTTI)
class Base {
public:
virtual void show() {
cout << "Base class" << endl;
}
};
class Derived : public Base {
public:
void show() override {
cout << "Derived class" << endl;
}
};
int main() {
// 场景 1:基类指针指向派生类对象(向下转换合法)
Base* basePtr1 = new Derived();
Derived* derivedPtr1 = dynamic_cast<Derived*>(basePtr1);
if (derivedPtr1 != nullptr) {
cout << "dynamic_cast(Base*→Derived*)成功:";
derivedPtr1->show(); // 调用 Derived 的 show
}
// 场景 2:基类指针指向基类对象(向下转换非法,返回 nullptr)
Base* basePtr2 = new Base();
Derived* derivedPtr2 = dynamic_cast<Derived*>(basePtr2);
if (derivedPtr2 == nullptr) {
cout << "dynamic_cast(Base*→Derived*)失败(符合预期)" << endl;
}
// 释放动态内存
delete basePtr1;
delete basePtr2;
return 0;
}
dynamic_cast依赖运行时类型信息(RTTI),因此基类必须包含虚函数(否则编译报错);向下转换时,若基类指针实际指向派生类对象,转换成功;否则返回nullptr(指针场景)或抛出异常(引用场景)。
| 转换运算符 | 核心作用 | 场景特点 |
|---|---|---|
static_cast | 日常非多态转换,编译期检查 | 最常用、安全(非向下转) |
reinterpret_cast | 底层位模式重新解释 | 风险高,仅底层场景用 |
const_cast | 专门移除 const 限定 | 专项工具,需谨慎修改 |
dynamic_cast | 多态类的运行时安全转换 | 依赖虚函数,运行时检查 |

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online