C++ 类型转换运算符

前言描述

  • 在C语言中,类型转换,可以直接使用(type)进行类型转换。
    variable = (type) variable;

  • 在C++看来,C语言中的类型转换运算符太过松散,对于这种松散的情况,C++采取的措施是,更严格地限制允许的类型转换,并添加4个类型转换运算符,使转换过程更规范:

    • dynamic_cast
    • const_cast
    • static_cast
    • reinterpret_cast

可以根据目的选择一个适合的运算符,而不是使用通用的类型转换。
这指出了进行类型转换的原因,并让编译器能够检查程序的行为是否与设计者想法吻合。


dynamic_cast
  • 通常,该运算符的语法如下:
 dynamic_cast < type-name > (expression)
  • 用途:
    使得能够在类层次结构中进行向上转换,而不允许其他转换。

  • 示例
    假设High和Low是两个类,而ph和pl的类型分别为High *和Low ,则仅当Low是High的可访问基类(直接或间接)时,下面的语句才将一个Low指针赋给pl:

pl = dynamic_cast <Low *> ph;

否则,该语句将空指针赋给pl。


const_cast
  • 语法
 const_cast< type-name > (expression)
  • 用途
    用于执行只有一种用途的类型转换,即改变值为const或volatile
    如果类型的其他方面也被修改,则上述类型转换将出错。也就是说,除了const或volatile特征(有或无)可以不同,type_nameexpression的类型必须相同
  • 示例
    假设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 改为 非const)
第二个类型转换是非法的,因为它同时尝试将类型从const High *改为const Low *。

  • 注意:但仅当最终指向的值不是const时才可行。

static_cast
  • 语法
 static_cast< type-name > (expression)
  • 用途
    仅当type_name可被隐式转换为expression所属的类型或expression可被隐式转换为type_name所属的类型时,上述转换才是合法的,否则将出错。(向上向下转换)
  • 示例
    假设High是Low的基类,而Pond是一个无关的类,则从High到Low的转换、从Low到High的转换都是合法的,而从Low到Pond的转换是不允许的:
High bar;
Low blow;
...
High * pb = static_cast<High *< (&blow);//valid
Low *pl = static_cast<Low *> (&bar);	//valid
Pond * pmer = static_cast<Pond * > (&blow);//invalid

reinterpret_cast
  • 语法
 reinterpret_cast< type-name > (expression)
  • 用途
    运用于一些较为危险的类型转换,推测是内存相关。
    下面放一个例子。
  • 示例
struct dat{
	short a;
	short b;
};
long value = 0xA224B118
dat *pd = reinterpret_cast<dat *>(&value);
cout << hex << pd->a;
---
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值