static_cast ,dynamic_cast,const_cast,reinterpret_cast

  static_cast

    定义:通俗的说就是静态显式转换,用于基本的数据类型转换,及指针之间的转换,当需要把一个较大的算术类型赋值给较小的类型时,这个转换非常有用,任何具有明确定义的类型转换,只要不包含const,

      都可以使用static_cast,格式如:static_cast<type-id>(expression),意为expression转换成type-id,但没有类型检查来保证转换的安全性

    使用:(1) 用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类是表示)是安全的;子类的对象一般比基类大

          这就是为什么基类指针可以指向并创建一个子类对象,但子类指针不能指向基类对象,即是因为上行转换是安全的,下行转换有风险

       (2) 进行下行转换(把基类指针或引用转换成子类指针或引用)时,由于没有动态类型检查,所以是不安全的

       (3) 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum等等,这种转换的安全性由开发人员来保证

       (4) 把void指针转换成目标类型的指针(不安全!),因为已经分配了内存,在更换目标类型的时候可能因为内存导致程序崩溃

       (5) 把任何类型的表达式转换成void类型

    注意:static_cast不能转换掉expression的const,volitale,或者__unaligned属性

    例如:int i = 0x7fff;long l;float f;

        l = static_cast<long>(i);

        i = static_cast<int>(l);

        //以及把子类指针转换成基类指针等

  dynamic_cast 

    定义:是用来执行继承体系中“安全的向下转型或跨系转型动作”,使用格式同static_cast,在进行下行转换时可以得知转型是否成功,如果转失败的是指针,那么会以一个null指针形式表现出来,如果是引用

        那么会以一个expression表现出来

  dynamic_cast与static_cast区别:static_cast全部用于明确定义的变换,包括编译器允许我们所做的不用强制转换的安全变换和不太安全但清楚定义的变换,

      在进行类型间上行转换时,其和static_cast的效果是一样的,在进行下行转换时比static_cast更安全

    例子:

      class B {

        public:

        int m_iNum;

        virtual void foo();

      };

      class D:public B {

        public:

        char *m_szName[100];

      }

      void func(B *pb) {

        D *pd1 = static_cast(pb);

        D *pd2 = dynamic_cast(pb);

      }

    在上面的代码中,如果pb指向一个D类型的对象,pd1和pd2是一样的,并且对这两个指针执行D类型的任何操作都是安全的,因为它本身就是D类型的,所以没问题,而如果pb指向的是一个B类型的对象

    那么pd1将是一个指向该对象的指针(不管是否有风险),对它进行D类型的操作将是不安全的(如访问m_szName),而pd2将是一个空指针,注意dynamic_cast转换时,B(基类)需要有虚函数,否则会编译出错

    static_cast则没有这个限制,这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚表中

  const_cast

    定义:对“const”和“volatile”进行转换,最常见的用途就是将某个对象的常量性去掉,使用其他类型转换表达式的const属性都将引发编译器编译错误

    例子:const char *pc; char *p = cosnt_cast<char *>(pc);//这种转换不能改变表达式的类型

  reinterpret

    转换为完全不同的意思,为了安全使用它,关键必须转换为原来的类型。转换成的类型一般只能用于位操作,否则就是为其他隐秘的目的,这是所有转换中最危险的,且跟平台有密切关系 

C++ 四种新式类型转换的更多相关文章

  1. C++学习笔记 四种新式类型转换

    static_cast ,dynamic_cast,const_cast,reinterpret_cast static_cast 定义:通俗的说就是静态显式转换,用于基本的数据类型转换,及指针之间的 ...

  2. 四种强制类型转换的总结(const_cast、static_cast、dynamic_cast、reinterpreter_cast)

    四种强制类型转换的总结(const_cast.static_cast.dynamic_cast.reinterpreter_cast) 转载 2011年10月03日 23:59:05 标签: stru ...

  3. C++中的关键字用法--- 四种强制类型转换的总结

    四种强制类型转换的总结(const_cast.static_cast.dynamic_cast.reinterpreter_cast 1. C风格的强制类型转换(Type Cast)很简单,不管什么类 ...

  4. C++中四种强制类型转换区别详解

    C++即支持C风格的类型转换,又有自己风格的类型转换.C风格的转换格式很简单,但是有不少缺点的: 1.转换太过随意,可以在任意类型之间转换.你可以把一个指向const对象的指针转换成指向非const对 ...

  5. C++中的四种强制类型转换符详解

    阅读目录 C++即支持C风格的类型转换,又有自己风格的类型转换.C风格的转换格式很简单,但是有不少缺点的: 转换太过随意,可以在任意类型之间转换.你可以把一个指向const对象的指针转换成指向非con ...

  6. [转载]C++中四种强制类型转换方式

    C++中四种强制类型转换方式 原文地址:http://www.cnblogs.com/home123/p/6763967.html 类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单( ...

  7. 【C++】 四种强制类型转换(static_cast 与 dynamic_cast 的区别!)

    强制类型转换 1. static_cast 2. dynamic_cast 3. const_cast 4. reinterpret_cast 5. 为什么要需要四种类型转换? 1. static_c ...

  8. C++四种强制类型转换详解

    什么是类型转换? 类型转换的含义是通过改变一个变量的类型为别的类型从而改变该变量的表示方式.为了类型转换一个简单对象为另一个对象你会使用传统的类型转换操作符. C与C++的类型转换 //C中: //复 ...

  9. C++提供的四种新式转换--const_cast dynamic_cast reinterpret_cast static_cast

    关于强制类型转换的问题,许多书都讨论过,写的最具体的是C++之父的<C++的设计和演化>. 最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_c ...

随机推荐

  1. Linux安装python3.7

    1.下载与解压 先到python官网: https://www.python.org/downloads/release/python-371/](https://www.python.org/dow ...

  2. python 操作剪切板

    python3 在使用网上找到的一些使用剪切板的片段时发现存在写入剪切板后乱码的情况, 研究后发现python3不能使用SetClipboardData方法, 要使用SetClipboardText ...

  3. Git 基础 - 打标签

    列出现有标签(或者使用git tag -l) $ git tag v0. v1. 如果只对 1.4.2 系列的版本感兴趣 $ git tag -l 'v1.4.2.*' v1. v1. v1. v1. ...

  4. Python 函数也是一种对象

    函数也是一种对象 func = lambda x, y: x+y print func(3, 4) def func(x, y): return x+y print func(3, 4) 效果相同. ...

  5. Python 创建和使用类

    python创建和使用类的方法如下 # class Dog(): # def __init__(self,name,age): # self.name=name # self.age=age # # ...

  6. Android 虹软免费人脸识别App

    人脸识别+本机Web后端 人脸sdk采用虹软sdk,本机web采用AndServer:上传姓名+人脸图片即可实现注册源码地址:https://github.com/joetang1989/ArcFac ...

  7. 学习笔记27—python中numpy.ravel() 和 flatten()函数

    简介 首先声明两者所要实现的功能是一致的(将多维数组降位一维).这点从两个单词的意也可以看出来,ravel(散开,解开),flatten(变平).两者的区别在于返回拷贝(copy)还是返回视图(vie ...

  8. 学习笔记14—Python error集

    1.Can't broadcast input array from shape (3,1) into shape (3,) resolution:    V[k:m,k] = v; v has sh ...

  9. MySQL学习(十五)

    索引的概念 索引是数据的目录,能快速定位数据的位置.索引提高了查询速度,降低了增删改的速度.并非加的越多越好. 一般在查询频率高的列上加,而且在重复度低的列上加效果更好.如在性别列上不用加索引,但是身 ...

  10. (转)Lua的table库函数insert、remove、concat、sort详细介绍

    原帖链接:http://www.jb51.net/article/64711.htm#comments 有增注标识的地方为额外注释,非原帖内容. 函数列表:(增注:只能用于数组!) table.ins ...