C/C++强制类型转换

******1、C风格
“()” 大法
C语言强转比较简单,只需要将想要转换的类型名加到原类型变量名之前就可以了;
******2、C++风格
C++提供了4种新的强制类型转换形式(通常称为新风格的或C++风格的强制转 型):const_cast(你要转的类型)、dynamic_cast( )、 reinterpret_cast()和 static_cast(),每一种都适用于特定的目的,具体如下:

(1)dynamic_cast 主要用于执行“安全的向下转型(safe downcasting)”,也就是说,要确定一个对象是否是一个继承体系中的一个特定类型。支持父类指针到子类指针的转换,这种转换时最安全的转换。它 是唯一不能用旧风格语法执行的强制类型转换,也是唯一可能有重大运行时代价的强制转换。

(2)static_cast 可以被用于强制隐形转换(例如,non-const对象转换为const对象,int转型为double,等等),它还可以用于很多这样的转换的反向转换 (例如,void*指针转型为有类型指针,基类指针转型为派生类指针),但是它不能将一个const对象转型为non-const对象(只有 const_cast能做到),它最接近于C-style的转换。应用到类的指针上,意思是说它允许子类类型的指针转换为父类类型的指针(这是一个有效的隐式转换),同时,也能够执行相反动作:转换父类为它的子类。

在此例中,被转换的父类没有被检查是否与目的类型相一致。
代码:
class Base {
};

class Derived : public Base {
};

Base *a = new Base;
Derived *b = static_cast<Derived *>(a);

'static_cast’除了操作类型指针,也能用于执行类型定义的显式的转换,以及基础类型之间的标准转换:
代码:
double d = 3.14159265;
int i = static_cast(d);
运行结果: i = 3;

(3)const_cast一般用于强制消除对象的常量性。它是唯一能做到这一点的C++风格的强制转型。这个转换能剥离一个对象的const属性,也就是说允许你对常量进行修改。

代码:
class Constant{

};
const Constant *a = new C;
Constant *b = const_cast<C *>(a);
此时的

(4)reinterpret_cast 是特意用于底层的强制转型,导致实现依赖(就是说,不可移植)的结果,例如,将一个指针转型为一个整数。这样的强制类型在底层代码以外应该极为罕见。操作结果只是简单的从一个指针到别的指针的值得二进制拷贝。在类型之间指向的内容不做任何类型的检查和转换。

******3、两者关系
旧风格的强制转型依然合法(C语言风格),但是新的形式更可取。
例如:有的编译器将不认同你所作的强制类型转换而报错(试图使用一个const_cast以外的新风格 强制转型来消除常量性,代码将无法编译)
还有就是在代码的迭代中使开发者更容易识别,这样就简化了在代码中寻找类型系统被破坏的地方的过程;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值