zoukankan      html  css  js  c++  java
  • C++-类型转换、类和对象、类的定义和实例化(day3)

    一、类型转换

    1、隐式类型转换

    char c='A';
    
    int i=c;

    在上述这一段代码中,发生了char到int的隐式类型转换,不止如此,在参数传递,返回值等地方也可能存在隐式转换。

    2、显式类型转换

    (1)强制类型转换

    char c='A';
    
    int i=(int)c;//c语言风格
    int i=int(c);//c++风格

    (2)C++在兼容C强制转换的同时,同时增加四种操作符形式的类型转换

    C++中四种操作符形式的类型转换:

      (1)静态类型转换

        目标类型变量=static_cast<目标类型>(源类型变量)

        使用场景:可以将void *转换为其他类型的指针。。。

    int a;
    void * pv=&a;//c++编译器ok,c编译器ok
    
    int *p=pv;//c++编译器报错,c编译器ok//解决方法如下

    int* pa=(int*)pv;
    int* pa=static_cast<int*>(pv);//double->int无法完成

      (2)动态类型转换

        目标类型变量=dynamic_cast<目标类型>(源类型变量):

    动态类型转换会对转换的数据类型进行检查。动态类型转换不支持基础数据类型间的转换,不支持无继承关系的两个类型之间的指针或引用转换,对于有继承关系的两个类,只支持向上转换(子类转父类),不支持向下转换(父类转子类)。

      (3)常类型转换

        目标类型变量=const_cast<目标类型>(源类型变量)

        使用场景:去除一个引用或者指针的常属性

    const volatile int a=10;//如果不加volatile,下面修改a的值的时候将失败,它的作用是防止编译器优化,因为一个常量会被加载到寄存器中,以避免多次读取
    
    const int * pa=&a;
    
    *pa=20;//无法编译通过,a的值是常量
    
    int * pa2 =const_cast<int *>(&a);//ok
    
    *pa2=20;//去除a的常属性

    注意:

      当c++编译器无法识别数据类型时,有可能会将其认为是布尔类型,此时只需将其转换为可识别类型即可。

      (4)重解释类型转换

        目标类型变量=reinterpret_cast<目标类型>(源类型变量)

        适用场景:任意类型的指针或引用的转换;指针和整数之间的转换等

    整数转换为指针:

    //*(int *)0xE0200080=123;在C++中可以使用下面的语句完成
    int addr 0xE0200080;
    
    int * paddr=reinterpret_cast<int *>(addr);
    
    *paddr=123;

    任意类型指针的转换:

    struct Data{

      char type[5];

      char acc[9];

      char passwd[7];

    };

    char text[]="0001001234567800888888"

    Data * pdata=reinterpret_cast<Data*>(text);//此时可以使用pdata来进行操作。

    二、总结

    1、小心使用宏

      可以使用const、enum、inline替换,因为宏对全局可见。如:

    #define PAI 3.14;  --->const double PAI =3.14;
    
    
    
    #define ERROR 0;
    
    #define SUCCEDD 1;---->num STATE{ERROR,SUCCESS};
    
    
    
    #define max(a,b) ((a)>(b)?(a):(b))--->inline int max(int a,int b){return a>b?a:b;}

    2、变量随用随声明,同时初始化

    3、尽量使用new和delete来替换,malloc和free

    4、少用void*、指针计算、少用联合体、少用强制转换

    5、使用string来表示字符串



  • 相关阅读:
    react第十九单元(react+react-router-dom+redux综合案例1)
    react第十八单元(redux中间件redux-thunk,redux工程目录的样板代码,规范目录结构)
    react第十七单元(redux和组件之间的通信,react-redux的相关api的用法)
    react第十六单元(redux的认识,redux相关api的掌握)
    react第十五单元(react路由的封装,以及路由数据的提取)
    react第十四单元(react路由-react路由的跳转以及路由信息)
    react第十三单元(react路由-react路由的跳转以及路由信息) #课程目标
    react第十二单元(react路由-使用react-router-dom-认识相关的组件以及组件属性)
    如何在ABAP程序中debug宏代码
    ◆◆0SRM寻源(sources of supply)debug断点设置小技巧
  • 原文地址:https://www.cnblogs.com/ptfe/p/11235419.html
Copyright © 2011-2022 走看看