文章目录
- 前言
- 一、dynamic_cast
- 二、static_cast
- 三、const_cast
- 四、reinterpret_cast
- 总结
前言
C++继承并扩展C语言的传统类型转换方式,提供了功能更加强大的转型机制(检查与风险)
转换类型 | 典型用途 | 安全性 |
---|---|---|
static_cast | 相关类型转换(非多态) | 编译时检查 |
dynamic_cast | 多态类型的向下转型 | 运行时检查 |
const_cast | 修改 const/volatile 限定符 | 需开发者保证 |
reinterpret_cast | 低级别二进制重新解释 | 高风险,平台依赖 |
建议:优先使用 static_cast 和 dynamic_cast,避免 const_cast 和 reinterpret_cast 除非必要。 |
C++11之后,C++中就有四种类型转换,分别是 dynamic_cast、static_cast、const_cast、reinterpret_cast
,一般用这四种强制转换可以替代在c代码中类似(int)
这种方式的转换。
如dynamic_cast<type-id> (expression)
这个表达式将 expression
转换为一个 type-id
类型的对象。 Type-id
必须是一个指针、指向一个已经定义类的类型或一个指向 VOID 的指针。 Expression
的类型必须是一个指针,如果 type-id
是一个指针;当 type-id
是一个引用的时候必须是一个左值。
一、dynamic_cast
用途:用于多态类型的安全向下转型(需运行时类型检查)。
常见场景:
- 将基类指针/引用转换为派生类指针/引用。
- 在运行时检查类型是否合法(失败时返回 nullptr 或抛出异常)。
Base* base = new Derived();
Derived* derived = dynamic_cast<Derived*>(base);
if (derived) {
// 转换成功
} else {
// 转换失败(base不指向Derived对象)
}
条件:
基类必须有虚函数(即多态类型)。
需要启用RTTI(Run-Time Type Information,通常默认开启)。
RTTI:
运行时类型识别。程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型(判断指针原型)
RTTI提供了两个非常有用的操作符:typeid和dynamic_cast。(三个最主要的东西,dynamic_cast,typeid,type_info)
typeid:typeid函数(为type_info类的友元函数,为什么要这样呢?目的是防止创建type_info对象)的主要作用就是让用户知道当前的变量是什么类型的,它可以返回一个type_info的引用,可以获取类的名称和编码typeid重载了type_info中的==和!=可以用于判断两个类型是否相等
1)typeid识别静态类型
当typeid中的操作数是如下情况之一时,typeid运算符指出操作数的静态类型,即编译时的类型。
(1)类型名
(2)一个基本类型的变量
(3)一个具体的对象(非指针对象)
(4)一个指向 不含有virtual函数的类 对象的指针的解引用
(5)一个指向 不含有virtual函数的类 对象的引用
静态类型在程序的运行过程中并不会改变,所以并不需要在程序运行时计算类型,在编译时就能根据操作数的静态类型,推导出其类型信息。
二、static_cast
用途:用于“相关类型”之间的转换(编译器可理解的隐式或显式转换)。
常见场景:
- 基本数据类型转换(如 int → double)。
- 类层次结构中基类与派生类的指针/引用转换(需确保安全)。
- 将 void* 转换为具体类型指针。
- 显式调用构造函数或转换函数。
double d = 3.14;
int i = static_cast<int>(d); // double → int
Base* base = new Derived();
Derived* derived = static_cast<Derived*>(base); // 需开发者确保安全
可以进行基本类型的转化,但是会损失精度类似与C语言的强制转化。跟reinterpret_cast不太一样reinterpret_cast是底层二进制的强制拷贝和语义转换不会损失精度。
三、const_cast
用途:移除或添加 const/volatile 限定符。
常见场景:
修改原本被声明为 const 的变量(但需确保原始对象本身不是常量)。
const int x = 10;
int* p = const_cast<int*>(&x); // 移除const
*p = 20; // 未定义行为!若x是真正的常量(如全局const),此处可能导致崩溃。
// 合法用法:修改原本是非const的临时const引用
int y = 30;
const int& ref = y;
const_cast<int&>(ref) = 40; // 合法,因为y本身不是const
注意事项:
修改原始常量对象会导致未定义行为。
通常用于兼容旧代码或特定API设计。
四、reinterpret_cast
reinterpret_cast是四种强制转换中功能最为强大的(最暴力,最底层,最不安全)。它的本质是编译器的指令。
用途:低级别的类型重新解释(直接按二进制位解释数据)。
常见场景:
指针与整数之间的转换(如 void* → uintptr_t)。
无关类型指针之间的转换(如 int* → char*)。
int x = 42;
int* p = &x;
uintptr_t addr = reinterpret_cast<uintptr_t>(p); // 指针→整数
char* buffer = reinterpret_cast<char*>(p); // int* → char*
注意事项:
高度依赖平台和编译器,可移植性差。
滥用可能导致未定义行为,仅在必要时使用(如系统编程、序列化)。
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。