static_cast

  • 用法:static_cast < type-id > ( expression )
  • 说明:该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。

它主要有如下几种用法:

  • 用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成子类指针或引用)时,由于没有动态类型检查,所以是不安全的。
  • 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
  • 把void指针转换成目标类型的指针(不安全!!)
  • 把任何类型的表达式转换成void类型。

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

dynamic_cast

  • 用法:dynamic_cast < type-id > ( expression )
  • 说明:该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void *;如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。

dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

class Base{
public:int m_iNum;virtual void foo();
};
class Derived:public Base{
public:char *m_szName[100];
};
void func(Base *pb){   Derived *pd1 = static_cast<Derived *>(pb);Derived *pd2 = dynamic_cast<Derived *>(pb);
}

在上面的代码段中,
如果pb实际指向一个Derived类型的对象,pd1和pd2是一样的,并且对这两个指针执行Derived类型的任何操作都是安全的;
如果pb实际指向的是一个Base类型的对象,那么pd1将是一个指向该对象的指针,对它进行Derived类型的操作将是不安全的(如访问m_szName),而pd2将是一个空指针(即0,因为dynamic_cast失败)。
另外要注意:Base要有虚函数,否则会编译出错;static_cast则没有这个限制。这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表中,只有定义了虚函数的类才有虚函数表,没有定义虚函数的类是没有虚函数表的。

另外,dynamic_cast还支持交叉转换(cross cast)。如下代码所示。

class Base{
public:int m_iNum;virtual void f(){}
};
class Derived1 : public Base{
};
class Derived2 : public Base{
};
void foo(){derived1 *pd1 = new Drived1;pd1->m_iNum = 100;Derived2 *pd2 = static_cast<Derived2 *>(pd1); //compile errorDerived2 *pd2 = dynamic_cast<Derived2 *>(pd1); //pd2 is NULLdelete pd1;
}

在函数foo中,使用static_cast进行转换是不被允许的,将在编译时出错;而使用 dynamic_cast的转换则是允许的,结果是空指针。

reinterpret_cast

  • 用法:reinpreter_cast<type-id> (expression)
  • 说明:type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。

 const_cast

  • 用法:const_cast<type_id> (expression)
  • 说明:该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。
  • 常量指针被转化成非常量指针,并且仍然指向原来的对象;常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。

c++类型转换:static_cast, dynamic_cast,const_cast和reinterpret_cast相关推荐

  1. C++类型转换(static_cast,dynamic_cast,const_cast和reinterpret_cast)

    一.概述 类型转换(cast)是将一种数据类型转换成另一种数据类型.例如,如果将一个整型值赋给一个浮点类型的变量,编译器会暗地里将其转换成浮点类型(即 隐式转换 ).转换是非常有用的,但是它也会带来一 ...

  2. C/C++中的数据类型转换()/static_cast/dynamic_cast/const_cast/reinterpret_cast

    文章目录 前言 数据类型自动转换 C语言中的强制类型转换 C++中的强制类型转换 static_cast dynamic_cast const_cast reinterpret_cast 强转关键字的 ...

  3. 显式强制类型转换static_cast, dynamic_cast, const_cast, reinterpret_cast

    显式强制类型转换(cast)包括以下操作符: static_cast,  dynamic_cast, const_cast, reinterpret_cast,对各种显式类型转换解释: static_ ...

  4. 类型转换static_cast,dynamic_cast,const_cast,reinterpret_cast等

    一.隐式类型转换 系统自动进行,不需要程序开发人员介入. int m = 3 +45.6; //把小数部分截掉,也属于隐式类型转换的一种行为. doublen = 3 +45.6; 二.显示类型转换( ...

  5. c++中的四种cast转换, dynamic_cast、static_cast、const_cast、reinterpret_cast

    C++11之后,C++中就有四种类型转换,分别是 dynamic_cast.static_cast.const_cast.reinterpret_cast,一般用这四种强制转换可以替代在c代码中类似( ...

  6. C++中static_cast, dynamic_cast, const_cast用法/使用情况及区别解析

    目录 第1部分. 隐式类型转换 第2部分. 显式类型转换 static_cast dynamic_cast reinpreter_cast const_cast 首先回顾一下C++类型转换: C++类 ...

  7. static_cast, dynamic_cast, const_cast,reinterpret_cast探讨

    http://www.cnblogs.com/chio/archive/2007/07/18/822389.html 首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1 ...

  8. static_cast, dynamic_cast, const_cast

    首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为"标准转换",包括以下几种情况: 1) 算术转换(Arithmetic ...

  9. static_cast, dynamic_cast, const_cast学习和探讨

    一 C语言中存在着两种类型转换: 隐式转换和显式转换 隐式转换:不同数据类型之间赋值和运算,函数调用传递参数--编译器完成 1) 算术转换(Arithmetic conversion) : 在混合类型 ...

最新文章

  1. ECCV 2020 | 腾讯优图8篇论文入选,涵盖目标跟踪、行人重识别、人脸识别等领域...
  2. 2019 半导体领袖新年展望(一)| 半导体行业观察
  3. Provisioning Services 7.6 入门到精通系列之九:创建和配置目标设备
  4. 【leetcode】Intersection of Two Linked Lists
  5. System类、包装类、Math类、Random、Arrays工具类
  6. [Django青铜修炼手册] 初识Django
  7. javascript 符号_理解JavaScript中“ =”符号的直观指南
  8. leetcode No.83 删除排序链表中的重复元素
  9. 优秀程序员的 18 大法则
  10. MYC编译器源码分析之程序入口
  11. 战斧湖战役之后的5rnm
  12. Order by 按照自定义顺序排序
  13. Mybatis常见面试题总结和基本概念
  14. wordpress 增加备案号
  15. yolov3选取正负样本
  16. 基于python实现的线性回归基础
  17. 百度小程序坐拥三大亿级流量入口 如何低成本制作百度小程序?
  18. 【开发工具】【windows】Visual Studio Code(VS Code)常用插件
  19. edusrc教育src漏洞平台
  20. 关于Context的理解(转)

热门文章

  1. WASM进阶-猿人学第二十题
  2. 关于平面图到对偶图的转化
  3. RK3566调试VL53L01
  4. css实现Table的cellpadding, cellspacing
  5. 【目标检测】YOLOv5能识别英雄和小兵?原理解析~
  6. 【APICloud系列|5】一键生成APP所有图标
  7. Web组成:静态网页,动态网页
  8. Word 模板渲染引擎-Poi-tl - 标签(二)
  9. 牛客网暑期ACM多校训练营(第六场)J-Heritage of skywalkert
  10. 鲍尔默炮轰纳德拉提出的通用Windows平台战略