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

    隐试类型转换:

    char c = 'A';
        int x = c;  //隐试类型转换
        cout << x << endl;

    显式类型转换: 

    //强制类型转换
        char c = 'A';
        int x = (int)c;  //C风格
        int y = int(c);//C++风格

    C++扩展了四种操作符形式的转换:

        //1.静态类型转换:static_cast
        //语法:目标变量=static_cast<目标类型>(源类型变量);
        //适用场景:将void*转化为其它类型的指针
        int* pi = NULL;
        char c = long(pi);
        //强制类型转换这种不合理的转换可以通过
        
        //char c2= static_cast<long>(pi);
        //不合理的转换会报错--编译器会自动检查是否合理
    
        void* pv=pi;
        //pi = pv;  错误
        //void*不能隐试转换成其它类型的指针
        pi = static_cast<int*>(pv);//将void*转化为其它类型的指针
    //2.动态类型转换:dynamic_cast
        //语法:目标变量=dynamic_cast<目标类型>(源类型变量);
        //后面讲
    //3.去常类型转换:const_cast
        //语法:目标变量=const_cast<目标类型>(源类型变量);
        //目标类型 必须是指针
        //适用场景:主要用于去掉指针或引用的const属性
        volatile const int i = 100;
        //int* pi = &i;  错误,因为i是const,相当于常量,不能保存常量地址
            
        int* pi= const_cast<int*>(&i);    //通过const_cast的转换,去掉变量i的const属性后再赋值
        *pi = 200;
    
        cout << "*pi=" << *pi << "," << "i=" << i << endl; 
        /*
        特殊注意:
        const的变量值第一次读取后会放到寄存区里,以后都从寄存器里,这样执行效率高
        volatile的作用:使用该变量时,每次都从内存读取,而不是读取寄存器中的副本,这样保存const_cast转换后*pi的值和i的值相同
        */
        
        cout << "pi=" << pi << "," << "&i=" << (int*)&i << endl;
        //&i=1  是编译器的错,把它转换成布尔类型了,强制类型转换一下就OK了
    //4.重解释类型转换:reinterpret_cast
        //语法:目标变量=reinterpret_cast<目标类型>(源类型变量);
        //适用场景一:指针和整形数进行转换
        
        //int* p = 0x12345678;    错
        int* p= reinterpret_cast<int*>(0x12345678);//把整形数转换成地址
    
        //适用场景二:任意类型指针或引用之间转换
        char buf[] = "0001001234567800123456";
        //"00"-->''
        struct A {
            char type[5];
            char id[9];
            char passwd[7];
        };
    
        A* a= reinterpret_cast<A*>(buf);//把buf指针转换成A*指针
        cout << a->type << endl;
        cout << a->id << endl;
        cout << a->passwd << endl;

  • 相关阅读:
    [BZOJ1006]神奇的国度
    配置ubuntu18.04
    数据库的基本操作
    关于排序的算法——桶排序
    关于TCP/IP协议的记录
    laravel学习历程
    装箱问题
    01背包
    数字三角形
    统计单词的个数
  • 原文地址:https://www.cnblogs.com/liming19680104/p/13468227.html
Copyright © 2011-2022 走看看