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类型。