C++四种强制类型转换

C语言中的类型转换

   在C语言中的类型转换一般有一下几种

int i = 1;
double d = i;//隐式类型转换
int *p = &i;
int add  = (int) p;//强制类型转换

但是这两种类型转换的可视性比较差,所有的转换形式都是以一种相同的形式书写,难以跟踪错误的转换。

为什么需要四种类型转换?

  1.隐式类型转换有些情况下会出问题。

  2.显示类型转换将所有情况混合在一起,代码不够清晰。

RTTI 

   运行时类型识别

1、typeid运算符

2、dynamic_cast运算符

C++强制类型转换 

  1.static_cast

       static_cast用于非多态类型转换(静态转换),编译器隐式执行的任何类型转换都可用static_cast,但是它不能用于两个不相关类型转换,如不能转换const类型的数据,也不能将struct转换成char、int等类型。

double d = 12.34;

int a = static_cast<int> d;

2.const_cast

   const_cast最常用的用途就是删除变量的const属性,方便赋值。

const int a = 1;
int *p = const_cast<int*>(&a);

3.reinterpret_cast

reinterpret_cast操作符通常为操作数的位模式提供较底层的重新解释,用于将一种类型转换成另一种不同的类型

1.在指针之间,将一个类型的指针转换为另一个类型的指针。

2.将指针转换一个整型数,但不能用于非指针类型的转换。

typedef void (*FUNC)();
int DoSomething(int i)

{
    cout << "one" << endl;
    return 0;
}
void Test()
{
    FUNC f = reinterpret_cast<FUNC>(DoSomething);
    f();
} 

 reinterpret_cast可以编译以FUNC的定义方式去看待DoSomething函数

C++不保证所有的函数指针都被一样的使用,所以这样用可能会产生不确定的结果。

4.dynamic_cast

  与前三种类型转不同的地方是运行时类型识别。

   dynamic_cast用于将一个父类对象的指针或引用转化为子类的指针或引用。 

 1、向上转换

   将子类指针或引用转化为基类的指针或引用,更具赋值兼容规则不用转换直接赋值是安全的。

2、向下转换

   用dynamic_cast基类对象指针转换为子类指针或引用都是安全的。

class A
{
public:
     virtual void f(){}
};
class B
{};
void fun(A *pa)
{
   B* pb = dynamic_cast<B*>(pa);
}
int main()
{
  A a;
  B b;
  fun(&a);
  fun(&b);
  return 0;
}

注意:

   1.dynamic_cast只能用于含有虚函数的类

   2.dynamic_cast转化时先进行类型检测,成功则转换,如果失败,返回0.

 

 

 

 

 

  

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值