Chinaunix首页 | 论坛 | 博客
  • 博客访问: 269068
  • 博文数量: 138
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 971
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-03 10:05
文章分类

全部博文(138)

文章存档

2016年(1)

2015年(137)

我的朋友

分类: C/C++

2015-07-08 09:52:31

转换的含义是通过改变一个变量的类型为别的类型从而改变该变量的表示方式。为了类型转换一个简单对象为另一个对象你会使用传统的类型转换操作符。比如,为了转换一个类型为doubole的浮点数的指针到整型:
代码:
int i;
double d;

i = (int) d;
或者:

i = int (d);

对于具有标准定义转换的简单类型而言工作的很好。然而,这样的转换符也能不分皂白的应用于类(class)和类的指针。ANSI-C++标准定义了四个新的转换符:'reinterpret_cast', 'static_cast', 'dynamic_cast' 和 'const_cast',目的在于控制类(class)之间的类型转换。
代码:
reinterpret_cast<new_type>(expression)
dynamic_cast<new_type>(expression)
static_cast<new_type>(expression)
const_cast<new_type>(expression)

1 reinterpret_cast

'reinterpret_cast'转换一个指针为其它类型的指针。它也允许从一个指针转换为整数类型反之亦然。(译注:是指针具体的地址值作为整数值)
这个操作符能够在非相关的类型(内置类型和自定义类)之间转换。操作结果只是简单的从一个指针到别的指针的值的二进制拷贝。在类型之间指向的内容不做任何类型的检查和转换

2 static_cast

'static_cast'允许执行任意的隐式转换和相反转换动作。(即使它是不允许隐式的)static_cast它能在内置的数据类型间互相转换,对于类只能在有联系的指针类型间进行转换。可以在继承体系中指针转换来、转换去,但是不能转换成继承体系外的一种类型。应用到类的指针上,意思是说它允许子类类型的指针转换为父类类型的指针(这是一个有效的隐式转换),同时,也能够执行相反动作:转换父类为它的子类。
在这最后例子里,被转换的父类没有被检查是否与目的类型相一致。
不能再自定义类型和内置类型之间转换,也不能在内置类型和指针之间转换。
3 dynamic_cast
(不仅时只能用于继承层次的类之间,而且时类对象的指针或引用哦。这个就和隐式转换不一样了 也就是其存在的价值)
'dynamic_cast'只用于继承体系中对象的指针和引用。当用于多态类型时,它允许任意的隐式类型转换以及相反过程。不过,与static_cast不同,在后一种情况里(注:即隐式转换的相反过程),dynamic_cast会检查操作是否有效。如果绑定到引用或指针的对象不是目标类型,则dynamic转化失败:如果转换到指针类型的dynamic_cast失败,则转换到的指针值为NULL(即地址为0值!!所以,指针为null对应的地址值(指针的值)即为0!!);如果转换到引用类型的dynamic_casr失败,则抛出一个异常。
例如 :
            Base * ptr=new Derived; //绑定到转换的目标类型:Derived         //如果时Base * ptr=new Base; 下一步转换就失败;因为ptr绑定的不是目标类型
            Derived * dptr=dynamic_cast<Derived*>(ptr); //转换成功

由于指针或引用所绑定到的对象的类型在编译时是未知的,因此,检测在运行时进行。检测不是强制的,而是一种咨询形式的

总结1 :
    最宽泛的是reinterpret_cast,非相关类(内置类型和自定义类型)之间  ; 特别的 指针到指针 指针到整数 
    其次是static_cast ,有继承关系
的类的指针之间  ;特别的 内置类型之间
    最后时dynamic_cast ,用于有继承关系的指针和引用之间,而且会做检查转化是否有效 。没有特别的
总结2 :
     在进行内置类型转换时,用reinterpret_cast和static_cast不同:static会进行必要的检测,按照转化类型,重新构造了二进制比特模型;而reinterpret仅仅是重新解释了给出对象的比特模型,而没有进行二进制转换。
     例如:double d=reinterpret_cast<double>(int n)  ,reinterpret仅仅是赋值n的比特位到d,没有进行必要的分析,最终得到一个无用值
               double d= static_cast<double>(int n) ,static会正确的为双精度整数d不足比特位,最终达到n.0
4 const_cast

这个转换类型操纵传递对象的const属性,或者是设置或者是移除:

阅读(1060) | 评论(0) | 转发(0) |
0

上一篇:类型转换运算符重载

下一篇:malloc(0)

给主人留下些什么吧!~~