C++ 强制类型转换

一.强制类型转换

C++语言中提供了static_cast、const_cast、reinterpret_cast和dynamic_cast。这四个关键字都是用于强制类型转换的。 

二.static_cast

1.基本数据之间的转换,如int转化为double

int a = 1;
double b = static_cast<double>(a);

2.用于类层次结构中基类和派生类之间指针或引用的转换
①进行上行转换(把派生类的指针或引用转换成基类表示)是安全的
②进行下行转换(把基类的指针或引用转换为派生类表示),由于没有动态类型检查,所以是不安全的

//写两个类,假如 Derive类继承Basic
Basic *b = nullptr;
Derive *d = new Derive;
b = static_cast<Basic *> d;

3.把空指针转换成目标类型的空指针

int *p;
void *m = malloc(sizeof(int));
p = static_cast<int *>m;

4.把任何类型的表达式转换为void类型 

三.const_cast

cost_cast即用于强制转换指针或者引用的const或volatile限制,特别注意的是,const_cast不是用于去除变量的常量性,而是去除指向常数对象的指针或引用的常量性,其去除常量性的对象必须为指针或引用。

//错误例子
const int a = 2;
int b = const_cast<int>a;        //错误,const_cast强制转换的对象必须是指针或引用

//正确例子
int c = 2;
const int *d = &c;
int *e = const_cast<int *>d;

四.reinterpret_cast 

reinterpret_cast运算符用于处理无关类型之间的转换,他会产生一个新的值,这个值会有与原始参数(原数据类型)有完全相同的比特位。

1.从指针类型到一个足够大的整数类型

2.从整数类型或者枚举类型到指针类型

3.从一个指向函数的指针到另一个不同类型的指向函数的指针

4.从一个指向对象的指针到另一个不同类型的指向对象的指针

5.从一个指向类函数成员的指针到另一个指向不同类型的函数成员的指针

6.从一个指向类数据成员的指针到另一个指向不同类型的数据成员的指针

五.dynamic_cast

1.前面三种都是编译时完成的强制转换,dynamic_cast是运行时处理的。

2.不能用于内置的基本数据类型的强制转换。

3.dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。

4.使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。

5.在类的转换时,在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

使用dynamic_cast进行向下强制类型转换。使用此关键字有以下几个条件:

①.必须有虚函数

②.必须打开编译器的RTTI开关

③.必须有继承关系 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灬Sunnnnn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值