C++显式转换(RTTI映射语法)

来源:互联网 发布:农村淘宝合伙人可以吗 编辑:程序博客网 时间:2024/06/05 14:40

有的时候,我们可以使用显式转换(又称强制类型转换),明确地告知编译器:这种转换正是程序所期望的,请不要再出现啰嗦的警告,如下:

  1. short s2 = (short)100000; //ok

显示转换的语法如下:

  1. (类型)表达式;
  2. 类型(表达式);
  3. (类型)(表达式);

也就是说,如下3种形式都可以:

  1. s2 = (short)100000; //ok
  2. s2 = short(100000); //ok
  3. s2 = (short)(100000); //ok

一般来说,第1种的用法更常见一些。

以上的表达方式非常简洁,但是C++并不推荐使用该方式,而推荐使用强制类型转换操作符(包括static_cast、dynamic_cast、reinterpret_cast和const_cast)来完成显式转换,它们的含义如表4-2所示。

表4-2 强制类型转换操作符

操作符

中文名称

含义

dynamic_cast

动态类型转换符

支持多态而存在,

它主要用于类之间的转换

static_cast

静态类型转换符

仅仅完成编译时期的转换检查

reinterpret_cast

再解释类型转换符

完成不同类型指针之间的相互转换

const_cast

常类型转换符

用来修改类型的const或volatile属性

接下来我们将简单回顾一下这些操作符,它们在Visual C++代码中经常出现。

1.动态类型转换符dynamic_cast

dynamic_cast为支持多态而存在,它主要用于类之间的转换,包括向下转换(downcast)和向上转换(upcast)。向下转换即将一个指向基类的指针或引用转换成一个指向派生类的指针或引用,如:

  1. void CMyMenu::UpdateMenu(CMenu *pmenu)
  2. {
  3. CMyMenu *psubmenu = dynamic_cast<CMyMenu *>(pmenu);
  4. }

当使用dynamic_cast尝试进行指针的非法转换时,指针的值会被赋成0。当这个非法转换是针对引用而进行时,C++会抛出一个bad_cast异常来通知这个错误。

2.静态类型转换符static_cast

静态类型转换仅仅完成编译时期的转换检查,它一般用于如下场合。

用于类层次结构中基类和子类之间指针或引用的转换。进行向上转换(把子类的指针或引用转换成基类表示)是安全的(向上转换一般都是隐式转换,这时候 实际上根本就没有必要使用静态类型转换);进行向下转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。

完成任何类型的指针与void之间的转换。

将空指针(0)转换成目标指针类型。

用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要由程序员来保证。

3.再解释类型转换符reinterpret_cast

再解释类型转换完成的都是一些不可思议的类型转换。实际上,所有指针的值都是一个表示地址的数值,值本身的转换是没有任何问题的。所谓"再解释",是指对指针的类型(如:int *和double *)进行重新解释。

再解释类型转换reinterpret_cast完成不同类型指针之间的相互转换,同时也支持将指针与数字之间的转换,如下代码:

  1. void CMyList::OnCustomDraw(NMHDR *pNMHDR, LRESULT *pResult)
  2. {
  3. NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
  4. }

该段代码在MFC源码中比较常见,它将NMHDR指针重新解释成NMLVCUSTOMDRAW指针。

4.常类型转换符const_cast

常类型转换const_cast用来修改类型的const或volatile属性。除了const 或volatile修饰之外,其操作对象的类型和目标类型必须是一样的。

0 0
原创粉丝点击