• 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来表示字符串



  • 相关阅读:
    Python中的passed by assignment与.NET中的passing by reference、passing by value
    从系统性能优化谈对象相等性
    .NET Core应用的三种部署方式
    cola-ui的使用
    谁不是一边娶妻生子,一边死在路上。请你好好生活
    MySQL的5种时间类型的比较
    压缩20M文件从30秒到1秒的优化过程
    CentOS 7下MySQL 5.7安装
    CentOS6.5下安装JDK1.7+MYSQL5.5+TOMCAT7+nginx1.7.5环境安装文档
    CentOS下安装FreeTDS
  • 原文地址:https://www.cnblogs.com/ptfe/p/11235419.html
Copyright © 2020-2023  润新知