zoukankan      html  css  js  c++  java
  • c++中的类型转换

    c++中的转换方法: cast-name<type> (expression)

    注意 转换的时候,就算指针的类型发生变化,编译器并没有改变内存的内容,原来的指针指向哪儿还是在哪儿,这在有时候会出现一些不可思议的结果

    p175

    其中 cast-name有四种:static-cast,const-cast,reinterpret-cast,dynamic-cast

    1,reinterpret_cast和蒋园括号蒋类型括起来的效果相同

    int *ip;
    char * pc=(int*)pc;
    等价于
    char * pc =reinterpret_cast<char*>(ip)

    2,const_cast是唯一可以转换到表达式const性质的转换

    const double value=0.0f;
    double* pd=const_cast<double*>(&value);

    3,static_cast的效果类似于编译器隐式执行的所有类型转换。

    对于基本类型,只有当相互之间可以隐式转换的时候,static_cast的转换才是合法的,否则蒋出错

    对于类层次之间的转换,相对复杂些,参见下面dynamic_cast的介绍

    4,dynamic_cast转换的对象只能是指针或者引用,涉及运行时的类型检查,需要检查虚函数表,因此只有对有虚函数表的类才能使用dynamic_cast

    dynamic分为两步执行

    1)检查请求的转换是否有效,否则返回NULL(对指针)或者返回异常(对引用)

    2)只有转换有效,才进行检查

    对于类间的上行转换和下行转换:

    1)进行上行转换的时候,因为默认就可以进行隐式转换,因此static_cast和dynamic_cast是等效的

    2)进行下行转换的时候,dynamic_cast比static_cast更安全。

    对于单类继承,如果指针确实指向继承类的对象,那么向下转型时,dynamic_cast比static_cast都可以成功;但是如果指针指向的基类对象,dynamic_cast会报错,但是static_cast则试图用基类指针去操作继承类,是不安全的。

    对于多继承,如果指针确实指向继承类的对象,那么向下转型时,dynamic_cast比static_cast都可以成功;但是如果指针指向的基类对象,dynamic_cast会报错,但是static_cast则试图用基类指针去操作继承类,是不安全的。但是蒋声明时的基类指针转换到其兄弟类的时候,dynamic_cast可以成功,然而static_cast则不能编译,除非先转换为继承类再转换为兄弟基类

  • 相关阅读:
    MVC,MVP,MVVM的区别
    jQuery Mobile 实现苹果滑动删除闹钟功能的几点总结
    AngularJS执行流程详解
    基于angularJS的表单验证练习
    jQuery 中 attr() 和 prop() 方法的区别
    天猫消息盒子的CSS实现
    jQuery事件之传递参数
    浅谈js中的垃圾两种回收机制
    js中的DOM操作汇总
    log4net
  • 原文地址:https://www.cnblogs.com/bobodeboke/p/3783339.html
Copyright © 2011-2022 走看看