c++中的4种类型转换

来源:互联网 发布:ping 的端口 编辑:程序博客网 时间:2024/06/11 19:22

1.C++中有哪4个和类型转换相关的关键字?这些关键字都有什么特点?应该在哪些场合下使用.

   C语言中的强制类型转换可以随意的转换我们想要的类型了,格式如下(类型) 变量名;

   为什么c++还要引入新的4种类型转换呢?

  这是因为新的类型转换控制符可以很好的控制类型转换的过程,允许控制各种类型不同的转换.

  还有一点好处是C++的类型转换控制符能告诉程序员或读者我们这个转换的目的是什么,我们

 只要看一下代码的类型转换控制符,就能明白我们想要达到什么样的目的.

1)static_cast <T*> (content)  静态转换.在编译期间处理

   它主要用于C++中内置的基本数据类型之间的转换.但是没有运行时类型的检测来保证转换

   的安全性.

   为什么需要static_cast类型的转换?

   a.用于基类和子类之间的指针或引用的转换。这种转换把子类的指针或引用转换为基类表示是安全的;

     进行下行转换,把基类的指针或引用转换为子类表示时,由于没有进行动态类型检测,所以是不安全的;

   b.把void类型的指针转换成目标类型的指针(不安全).

   c.用于内置的基本的数据类型之间的转换.

   d.把任何类型的表达式转换成void类型的.

   注意:static_cast不会转换掉content的const,volatile,__unaligned属性

2)const_cast<T*>(content):去常转换;编译时执行;

  它主要作用同一个类型之间的去常和添加常属性之间的转换.不能用做不同的类型之间的转换.

  它可以把一个不是常属性的转换成常属性的,同时它也可以对一个本是常属性的类型进行去常.

3)dynamic_cast<T*>(content) 动态类型转换;也是向下安全转型;是在运行的时候执行;

   通常用于基类和派生类之间的转换.转换时会进行类型安全检查。

   a.不能用于内置的基本数据类型之间的转换.

   b.dynamic_cast转换成功的话返回的是类的指针或引用,失败返回null;

   c.dynamic_cast进行的转换的时候基类中一定要有虚函数,因为只有类中有了虚函数,

     才说明它希望让基类指针或引用指向其派生类对象的情况,这样才有意义.

    这是由于运行时类型检查需要运行时类型的信息,而这些信息存储在虚函数表中.

  d.在类的转换时,在类层次间进行转换的时候,dynamic_cast和static_cast进行上行转换

     的时候效果是一样的;但是在进行下行转换的时候,dynamic_cast会进行类型检查所以

     它更安全.它可以让指向基类的指针转换为指向其子类的指针或是其兄弟类的指针;

4)reinterpret_cast<T*>(content)重解释类型转换;

   它有着和C风格强制类型转换同样的功能;它可以转化任何的内置数据类型为其他的类型,

   同时它也可以把任何类型的指针转化为其他的类型;它的机理是对二进制数据进行重新的

   的解释,不会改变原来的格式,而static_cast会改变原来的格式;

0 0