简单粗暴!C++类型转换操作符

C语言

int i = 1double d = 1.5;

int d2 = (int)d;
double i2 = (double)i;//能应付基本类型,不适用于复杂自定义类型

C++

static_cast
  • 可以完全代替C语言的基本类型转换
  • 可以父子类指针互相转换,如果两个类不相关,则无法转换
class Base(){};
class Derived:public Base{};

int i = 1;
double d = 1.5;

int D1 = static_cast<int>(d);
double D2 = static_cast<double>(i);

Base * b1 = new Base;
Base * b2 = new Derived;

Derived * B1 = static_cast<Derived *>(b1); //转换成功(不安全)
Derived * B2 = static_cast<Derived *>(b2); //转换成功(安全)
/*如果父类指针指向一个父类对象,将父类指针转化为子类指针是不安全的
如果父类指针指向一个子类对象,则不存在安全问题*/
dynamic_cast
  • 只能用于对象指针之间的转换
  • 可以父子类指针互相转换,转换结果也可以是引用
  • 在将父类指针转换为子类指针的过程中,需要对背后的对象类型进行检查,以保证完全匹配
class Base{virtual void my(){} };
class Derived:public Base{};

Base *b1 = new Base;
Base *b2 = new Derived;

Derived *B1 = dynamic_cast<Derived *>(b1); //转换失败(返回NULL)
Derived *B2 = dynamic_cast<Derived *>(b2); //转换成功

Derived &b3 = dynamic_cast<Derived &>(*b1); //转换失败(抛出异常)
Derived &b4 = dynamic_cast<Derived &>(*b2); //转换成功
/*只有当一个父类指针指向一个子类对象,且父类中包含虚函数时,能成功将父类指针转换为子类指针,否则返回空指针
如果是引用抛出异常*/
const_cast
  • 可以在转换过程中增加或删除const属性
class Test{};
const Test * t1 = new Test;
Test * t2 = const_cast<Test *>(t1); //转换成功
reinterpret_cast
  • 可以将一种类型的指针直接转换为另一种类型的指针,不论两个类型之间什么关系
  • 可以将指针与整数之间互相转换
  • 常用在不同函数指针之间的转换
class A{};
class B{};

A * a = new A;
B * b = reinterpret_cast<B *>(a); //转换成功
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值