C++中的四种显式类型转换之static_cast

在C++中提供了类型向上转换和向下转换的方法。关于向上转换和向下转换区别如下:


1、从派生类转换到基类,在继承图中来说是向上的,所以一般称为向上类型转换。向上类型转换总是安全的,因为从更专门的类型转换到更一般的类型。可能出现的唯一的事情就是失去成员函数。向上转换可以通过虚函数来实现。下面的程序就是一个向上转换的例子:

class base{

base(){}

virtual ~base(){}

};

class derived:public base{

derived(){}

virtual ~derived(){}

};

void main()

{

base *Base=new derived;//这里就是将derived的指针类型向上转换成base的指针类型

}

2、static_cast<type>(content)  该运算吧content中的数据转换成type类型的数据,但是没有运行时类型检查来保证其转换的安全性。

     其实在c中常用的类型转换例如   

char i; 

int j=0xff33ff44;

i=(char)j;

这样已经能把数据转换成想要的类型,但是在c++中为什么要用一种新的表示方式呢?

因为在c++中的static_cast<type>(content)可以更好的控制转换的过程,他能更清楚地表示想要做什么,更容易让别人理解。

static_cast可以实现基本数据类型的转化,例如: int i=static_cast<int>(9.876);

但是如果用它来进行类之间的转换,可要求转换成的类和被转换的类之间有一定的继承关系,但并不要求包含虚函数。例如:

class A{

};

class B:public A{

};

class C{

};

void main()

{

A*a=new A;

B*b=null;

C*c=null;

int i=188;

int *p=&i;

void *voidP=&i;


b=static_cast<B*>(a);//正确,这里B类继承了A类,两者之间有一定的关系

c=static_cast<C*>(c);//编译时将发生错误,因为A类和C类之间没有任何的关联

float*b=static_cast<float*>(p);//这里错误,不能见int*转换成float*

float*k=static_cast<float*>(voidP);//正确,这里可以将void*类型转换成float*类型

}


其实static_cast转换和传统的转换是类似的只要将static_cast和圆括号去掉,再将尖括号改成圆括号就变成了传统的显示转换方式。

它主要有如下几种用法:
(1)用于类层次结构中基类和子类之间指针或引用的转换。
  进行上行转换(把子类的指针或引用转换成基类表示)是安全的;
  进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。
(2)用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员保证。
(3)把空指针转换成目标类型的空指针。
(4)把任何类型的表达式转换成void类型。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值