C++四中强制类型转换

C++四中强制类型转换

注:类型转换干扰了正常的类型检查,一般情况下尽量少用。

C风格:

Type a = (Type)b;

C++风格(4种):

(1) static_cast<Type>(expression);
(2) dynamic_cast<Type>(expression);             //支持运行时类型识别
(3) reinterpret_cast<Type>(expression);
(4) const_cast<Type>(expression);

  其中dynamic_cast支持运行时类型识别,安全性较好。

1.static_cast

应用:任何具有明确定义的类型转换,只要不包含底层const属性,都可以使用。常见如下:
  (1) 用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换;
    ——进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;
    ——进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。
  (2)用于基本数据类型之间的转换。如int转换为char,int转换为enum,安全性由开发人员保证;
  (3)把空指针(void*)转换成目标类型的指针;
  (4)把任何类型的表达式转换成void类型。
  

2.dynamic_cast

特点:支持运行时类型识别
要求:
  (1)Type必须是一个类类型,并且要求该类中含有虚函数,否则编译报错。
  (2)如果 Type 是类指针类型,那么expression也必须是一个指;,如果 type-id 是一个引用,那么 expression 也必须是一个左值。
应用:类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
  与static_cast相比,(1)dynamic_cast支持运行时类型识别,在下行转换时比static_cast安全;(2)dynamic_cast支持类之间的交叉转换,而static_cast不支持;(3)dynamic_cast要求转换的类类型含有虚函数,而static_cast没有这个限制。
  
  classB
{
public:
int m_iNum;
virtual void foo();
};

classD:publicB
{
public:
char* m_szName[100];
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    B* pb;
    D* pd1=static_cast<D*>(pb);         //pd1是一个指向B类对象的指针
    D* pd2=dynamic_cast<D*>(pb);        //运行时检查,对pd2进行 D 类型的操作将是不安全的,故pd2 将是一个空指针
    
    D* pd;
    D* pd3=static_cast<D*>(pb);
    D* pd4=dynamic_cast<D*>(pb);
}

  如上代码,pd3和pd4是一样的,并且对这两个指针执行 D 类型的任何操作都是安全的。
  如果Type是指针类型,转换不安全时将返回空指针;当Type是引用类型,转换不安全时,将会抛出bad_cast异常,可以用try...catch(bad_cast)...处理。

3.reinterpret_cast

说明:通常对位模式提供较低层次上的重新解释。这种转换本质上依赖于机器,想要安全的使用必须对涉及的类型和编译器实现转换的过程都非常了解,,这种转换尽量少用。

4.const_cast

应用:只是用来改变运算对象底层const属性,将常量转化为非常量,但不能进行类型转换。

const char* str= "123";                 //字符串常量
str = "321";                            //错误:字符串常量无法改变
char* str1 = const<char*>(str);
str1 = "321";                           //正确
string str2 = const<string>(str);       //错误:const_cast无法改变类型

posted on 2016-11-15 16:46  silentteen  阅读(568)  评论(0编辑  收藏  举报