C++读书笔记之静态转换(static

    技术2022-05-20  57

    C++读书笔记之静态转换(static_cast)

    相对动态类型转换,静态类型转换则做范围更广的转换,但前提是必须是相关的类型,也就是说,编译器必须认为是可理解的,例如,一个非多态的类层次结构,祖孙对象的指针互易。如,研究生对象指针到学生对象指针的转换,或反之。由于void *到任何类型指针都可以进行想融性的转换,所以,void *到学生对象的指针转换也可以由static_cast来进行,还是从局部堆空间申请的空间转换为整形数组空间等。甚至有时候,要将void * 转到多态对象的指针,也要先经过static_cast过度一下。

            void fn(void * pd, void * pa) 

      {

    Student s("John");

    GraduateStudent gs("Smith");

    Student * ps = static_cast<Student *> (&gs);

    GraduateStudent * pgs = static_cast<GraduateStudent *> (ps);

    Student * pp = static_cast<Student *> (pd);

    Account * px = static_cast<Account *> (pa);

    Saving * pSa = dynamic_cast<Saving *> (px);

    int * p = static_cast<int *> (malloc(100));

    }

    假如Student类与GraduateStudent类无关,那么ps和pgs指针只能是NULL(#define NULL 0);假如pd不是指针,而因为pp是指针,所以pp的值也只能是NULL;假如pa不是指针,则px的值只能是NULL,而且连累到pSa的值也是NULL;这就是使用static_cast所带来的类型安全转换的检查帮助,比无根据地进行类型转换形式type(表达式)的"防盗性"要强,因为通过指针的非NULL判断,static_cast可以避免该转换后的操作失常。

    static_cast转换并不是专门针对指针的,只要是相关类型的转换,都可以操作。无非它主要是针对确定的类型,而不是针对多态。关于多态的类型转换,由dynamic_cast去做。


    最新回复(0)