[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,因此,需要在编写程序时确认转换的安全性。

主要在以下几种场合中使用:

    1. 用于类层次结构中,父类和子类之间 指针和引用的转换;
      • 进行上行转换,把子类对象的指针/引用转换为父类指针/引用,这种转换是安全的;
      • 进行下行转换,把父类对象的指针/引用转换成子类指针/引用,这种转换是不安全的,需要编写程序时来确认;
    2. 用于基本数据类型之间的转换,例如把int转char,int转enum等,需要编写程序时来确认安全性;
    3. 把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

用于移除类型的 constvolatile__unaligned 属性。

    • 常量指针被转换成非常量指针,并且仍然指向原来的对象;
    • 常量引用被转换成非常量引用,并且仍然引用原来的对象。
const char *pc;
char *p = const_cast<char*>(pc);

 

 

reinterpret_cast

非常激进的指针类型转换。

在编译期完成,可以转换任何类型的指针,所以极不安全。非极端情况不要使用。

int *ip;
char *pc = reinterpret_cast<char*>(ip);

 

End.

posted @   郝壹贰叁  阅读(164)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示