[c++] Type Casting
Ref: C++笔记 · C++类型转换
关键字 | 说明 |
---|---|
static_cast | 用于良性转换,一般不会导致意外发生,风险很低。 |
const_cast | 用于 const 与非 const、volatile 与非 volatile 之间的转换。 |
reinterpret_cast | 高度危险的转换,这种转换仅仅是对二进制位的重新解释,不会借助已有的转换规则对数据进行调整,但是可以实现最灵活的 C++ 类型转换。 |
dynamic_cast | 借助 RTTI,用于类型安全的向下转型(Downcasting)。 |
static_cast
一、怎么用
由于不提供运行时的检查,所以叫static_cast,因此,需要在编写程序时确认转换的安全性。
主要在以下几种场合中使用:
- 用于类层次结构中,父类和子类之间 指针和引用的转换;
- 进行上行转换,把子类对象的指针/引用转换为父类指针/引用,这种转换是安全的;
- 进行下行转换,把父类对象的指针/引用转换成子类指针/引用,这种转换是不安全的,需要编写程序时来确认;
- 用于基本数据类型之间的转换,例如把int转char,int转enum等,需要编写程序时来确认安全性;
- 把void指针转换成目标类型的指针(这是极其不安全的);
- 用于类层次结构中,父类和子类之间 指针和引用的转换;
针对2, 3的示例:
int i, j; double slope = static_cast<double>(j) / i; void *p = &d; double *dp = static_cast<double*>(p);
dynamic_cast
一、不同之处
在类层次结构中使用时,
-
- 上行转换和static_cast没有区别,都是安全的;
- 下行转换时,dynamic_cast会检查转换的类型,相比static_cast更安全。
在转换可能发生的前提下,dynamic_cast会尝试转换,
-
- 若指针转换失败,则返回空指针,
- 若引用转换失败,则抛出异常。
代理父类
自然是可以下行转换到子类。
class A { virtual void f(){}; }; class B : public A { };
void main() { A* pA = new B; B* pB = dynamic_cast<B*>(pA); }
void* 的转换
一些情况下,我们需要将指针转换为void*,然后再合适的时候重新将void*转换为目标类型指针。
class A { virtual void f(){} }; int main() { A *pA = new A; void *pV = dynamic_cast<void *>(pA); }
菱形继承中的上行转换
无需写B,C,D直接一口气转换到A,however,只能得到一个空指针。
class A { virtual void f() {}; }; class B :public A { void f() {}; }; class C :public A { void f() {}; }; class D :public B, public C { virtual void f() {}; }; void main() { D *pD = new D; A *pA = dynamic_cast<A *>(pD); // pA = NULL }
一种可行的方法是,自行指定一条转换路径,thus,不能省略掉B or C。
class A { virtual void f() {}; }; class B :public A { void f() {}; }; class C :public A { void f() {}; }; class D :public B, public C { void f() {}; }; void main() { D *pD = new D; B *pB = dynamic_cast<B *>(pD); A *pA = dynamic_cast<A *>(pB); }
const_cast
用于移除类型的 const、volatile 和 __unaligned 属性。
-
- 常量指针被转换成非常量指针,并且仍然指向原来的对象;
- 常量引用被转换成非常量引用,并且仍然引用原来的对象。
const char *pc; char *p = const_cast<char*>(pc);
reinterpret_cast
非常激进的指针类型转换。
在编译期完成,可以转换任何类型的指针,所以极不安全。非极端情况不要使用。
int *ip; char *pc = reinterpret_cast<char*>(ip);
End.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律