类型转换操作符

1. dynameic_cast

     假设High和Low是两个类,而ph和pl的类型分别为High *和Low *,则仅当Lows是High的可访问基类(直接或间接)时,语句:

     pl = dynameic_cast<Low *>ph;

才将一个Low *指针赋给pl;否则,该语句将空指针赋给pl。通常,该操作符的句法如下:

 

     dynameic_cast<type-name> (expression)

 

     该操作符使得能够在类层次结构中进行向上转换(由于is-a关系,这样的类型转换是安全的),而不允许其他转换。

 

     关于该操作符的更多介绍请查看<<RTTI运行时类型识别>>

 

2. const_cast

     该操作符用于执行只有一种用途的类型转换,即改变值为const或volatile,其句法如下:

 

     const_cast<type-name> (expression)

 

     如果类型的其他方面也被修改,则上述类型转换将出错。也就是说,除了const或volatile特征(有或无)可以不同外,type-name和expression的类型必须相同。

 

假设High和Low是两个类:
High bar;
const High * pbar = &bar;
...
High * pb = const_cast<High *> (pbar);             // valid
const Low * pl = const_cast<const Low *> (pbar);   // invalid

 

     第一个类型转换使得*pb成为一个可用于修改bar对象值的指针,它删除const标签。

     第二个类型转换是非法的,因为它同时尝试将类型从const High *改为const Low * 。

 

     const_cast可以修改指向一个值的指针,但修改const值的结果是不确定的。编译器可能禁止对const的修改,从而创建一个临时拷贝。

 

3. static_cast

 

      static_cast<type-name> (expression)

 

      仅当type-name可被隐式转换为expression所属的类型或expression可被隐式转换为type-name所属的类型时,上述转换才是合法的。

 

      假设High是Low的基类,而Pond是个无关的类,则从Hinh到Low的转换、从Low到High的转换都是合法的,而从Low到Pond的转换是不允许的:

High bar;
Low blow;
...
High * pb = static_cast<High *> (&blow);      // valid upcast
Low * pl = static_cast<Low *> (&bar);         // valid downcast
Pond * pmer = static_cast<Pond *> (&blow);    // invalid,Pond unrelated

 

      第二种转换是从基类指针到派生类指针,在不进行显示类型转换的情况下,将无法进行。但由于无须进行类型转换,便可以进行另一个方向的类型转换,因此使用static_cast来进行向下转换是合法的。

 

      同理,由于无须进行类型转换,枚举值就可以被转换为整型,所以可以用static_cast将整型转换为枚举值。还可以将double转换为int、将float转换为long以及其他各种数值转换。

 

4. reinterpret_cast

 

      reinterpret_cast <type-name> (expression)

 

该操作符用于一些危险的类型转换。它不允许删除const。例:

struct dat {short a; short b};
long value = 0xA224B118;
dat * pd = reinterpret_cast<dat *> (&value);
cout << pd->a;
          // display first 2 bytes of value

 

      reinterpret_cast操作符并不支持所有的类型转换。例如,可以将指针类型转换为足以存储指针表示的整型,但不能将指针转换为更小的整型或浮点型。另外,不能将函数指针转换为数据指针,反之亦然。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值