static_cast

//用法:
static_cast < type-id > ( exdivssion )

该运算符把exdivssion转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:
①用于类层次结构中基类和子类之间指针或引用的转换。

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

②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
③把空指针转换成目标类型的空指针。
④把任何类型的表达式转换成void类型。
注意:static_cast不能转换掉exdivssion的const、volitale、或者__unaligned属性。

dynamic_cast

dynamic_cast < type-id > ( exdivssion )

该运算符把exdivssion转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void *;

如果type-id是类指针类型,那么exdivssion也必须是一个指针,如果type-id是一个引用,那么exdivssion也必须是一个引用。

dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。

在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

实例对比

class Base
{virtual void fun(){}
};class Derived:public Base
{
};//由于需要进行向下转换,因此需要定义一个父类类型的指针Base *P,
//但是由于子类继承与父类,父类指针可以指向父类对象,也可以指向子类对象,
//这就是重点所在。如果 P指向的确实是子类对象,则dynamic_cast和static_cast都可以转换成功,如下所示:
Base *P = new Derived();
Derived *pd1 = static_cast<Derived *>(P);
Derived *pd2 = dynamic_cast<Derived *>(P);
//以上转换都能成功//但是,如果 P 指向的不是子类对象,而是父类对象,如下所示:
Base *P = new Base;
Derived *pd3 = static_cast<Derived *>(P);
Derived *pd4 = dynamic_cast<Derived *>(P);
//在以上转换中,static_cast转换在编译时不会报错,也可以返回一个子类对象指针(假想),
//但是这样是不安全的,在运行时可能会有问题,因为子类中包含父类中没有的数据和函数成员,
//这里需要理解转换的字面意思,转换是什么?转换就是把对象从一种类型转换到另一种类型,
//如果这时用 pd3 去访问子类中有但父类中没有的成员,就会出现访问越界的错误,导致程序崩溃。
//而dynamic_cast由于具有运行时类型检查功能,它能检查P的类型,由于上述转换是不合理的,所以它返回NULL。

总结
C++中层次类型转换中两种:上行转换和下行转换。

  • 对于上行转换,static_cast和dynamic_cast效果一样,都安全;
  • 对于下行转换:你必须确定要转换的数据确实是目标类型的数据,即需要注意要转换的父类类型指针是否真的指向子类对象,如果是,static_cast和dynamic_cast都能成功;如果不是static_cast能返回,但是不安全,可能会出现访问越界错误,而dynamic_cast在运行时类型检查过程中,判定该过程不能转换,返回NULL。

注意:虚函数对于dynamic_cast转换的作用为何使用dynamic_cast转换类指针时,需要虚函数呢。
dynamic_cast转换是在运行时进行转换,运行时转换就需要知道类对象的信息(继承关系等)。如何在运行时获取到这个信息——虚函数表。

C++对象模型中,对象实例最前面的就是虚函数表指针,通过这个指针可以获取到该类对象的所有虚函数,包括父类的。因为派生类会继承基类的虚函数表,所以通过这个虚函数表,我们就可以知道该类对象的父类,在转换的时候就可以用来判断对象有无继承关系。所以虚函数对于正确的基类指针转换为子类指针是非常重要的。static_cast则没有这个限制。

static_cast和dynamic_cast的区别相关推荐

  1. C++强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast

    一.static_cast:static_cast<new_type> (expression) static_cast相当于传统的C语言里的强制转换,该运算符把expression转换为 ...

  2. C/C++ 之 C++强制类型转换(static_cast、dynamic_cast、const_cast、reinterpret_cast)

    文章转载自:https://www.cnblogs.com/chenyangchun/p/6795923.html .在了解这块时,发现了这篇文档,感觉写的很不错! c强制转换与c++强制转换 c 语 ...

  3. 常规投放vs. static_cast与dynamic_cast [重复]

    class="question-status question-originals-of-duplicate"> 这个问题已经在这里有了答案: 什么时候应该使用static_ ...

  4. C++的类型强制转换,static_cast,dynamic_cast,const_cast,reinterpret_cast

    1. c强制转换与c++强制转换 c语言强制类型转换主要用于基础的数据类型间的转换,语法为: (type-id)expression//转换格式1type-id(expression)//转换格式2 ...

  5. 由static_cast和dynamic_cast到C++对象占用内存的分析

    static_cast和dynamic_cast是C++的类型转换操作符.编译器隐式执行的任何类型转换都可以由static_cast显式完成,即父类和子类之间也可以利用static_cast进行转换. ...

  6. static_cast、dynamic_cast、const_cast和reinterpret_cast总结

    前言 这篇文章总结的是C++中的类型转换,这些小的知识点,有的时候,自己不是很注意,但是在实际开发中确实经常使用的.俗话说的好,不懂自己写的代码的程序员,不是好的程序员:如果一个程序员对于自己写的代码 ...

  7. 标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast(转载)

    C 风格(C-style)强制转型如下: (T) exdivssion // cast exdivssion to be of type T 函数风格(Function-style)强制转型使用这样的 ...

  8. static_cast、dynamic_cast、reinterpret_cast、const_cast[转]

    C-style cast举例: int i; double d; i = (int) d; 上面的代码就是本来为double类型的d,通过(int)d将其转换成整形值,并将该值赋给整形变量i (注意d ...

  9. static_cast、dynamic_cast、reinterpret_cast、和const_cast

    (转自http://hi.baidu.com/seekvista/blog/item/87845a60ae248845ebf8f8dd.html) 关于强制类型转换的问题,很多书都讨论过,写的最详细的 ...

最新文章

  1. gbdt 回归 特征重要性 排序_RandomForest、GBDT、XGBoost、lightGBM 原理与区别
  2. linux系统界面光标不见了---木有了
  3. 协议地址结构_TCP/IP 协议 讲解
  4. 【Java】异常处理的目的
  5. elasticsearch java api查询
  6. html和vue的区别,2018-09-16第四课 (v-html和v-text的区别,v-once和v-pre的区别,vue的生命周期,选项卡)...
  7. 智慧环卫、智慧公厕、智能抽样、综合指挥中心、质量监察、指挥调度、车辆监管、收运计划、垃圾中转站、考核管理、垃圾收运、机械化保洁作业、环卫作业、油耗空驶、环卫设施、人工保洁作业、稽查扣分、Axure
  8. python调用c语言函数_从Python调用C函数
  9. 如何修复 MacBook Pro 电池寿命?
  10. springboot整合mybatis-plus多数据源分别连接mysql和oracle
  11. 鸿蒙os2.0电脑版,鸿蒙系统2.0PC版
  12. [].push.apply(a, b)是什么意思
  13. Linux Debian11 Podman容器常用命令
  14. 游戏项目开发的简单流程
  15. saas智能营销云平台是什么 大数据营销智能平台 - whale 帷幄
  16. vue02——vue中v-XXX指令
  17. [Excel]VLOOKUP函数使用示例
  18. 博学谷在线python教育_2020年最新 博学谷Python基础班(共9天)
  19. 北京2008中国代表团名单
  20. 亲亲小嘴后,不应该就是摸摸小胸么

热门文章

  1. “百付宝”带来百度未来格局的真正悬念
  2. 2018-2019-2 《网络对抗技术》Exp5 msf 20165222
  3. 人鱼小姐主题曲我痛苦的爱铃声 人鱼小姐主题曲我痛苦的爱手机...
  4. 域计算机远程无法关机,局域网内的远程关机
  5. 华为服务器系统关机命令,服务器远程关机命令
  6. 山东新高考604分怎么报计算机专业,山东新高考考400分左右如何填报志愿
  7. 京东手机金机奖揭晓,国内最强5G生态联盟成立
  8. GoJS使用以及去除水印办法
  9. 机器学习强基计划4-5:详解半朴素贝叶斯分类TAN原理(附Python实现)
  10. windows搭建ftp,且设置用户