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则不能编译,除非先转换为继承类再转换为兄弟基类

  • 相关阅读:
    51nod 1380 夹克老爷的逢三抽一 堆 脑洞题
    洛谷P2168 荷马史诗 堆 哈夫曼树
    HDU 4343 Interval query 倍增思想, DP
    洛谷P1969 积木大赛 贪心 差分
    codves1052 地鼠游戏 贪心
    hdu6031 Innumerable Ancestors
    Codeforces 278C Learning Languages(并查集) 求连通块
    [LeetCode]80. Remove Duplicates from Sorted Array II删除数组中的重复值
    [LeetCode]86. Partition List分离链表
    [LeetCode]42. Trapping Rain Water雨水填坑
  • 原文地址:https://www.cnblogs.com/bobodeboke/p/3783339.html
Copyright © 2011-2022 走看看