• 【转】C++四种类型转换方式


    C++四种类型转换方式

    C风格的强制类型转换(Type Case)很简单,不管什么类型的传统转换都是:Type b = (Type)a,但是C风格的类型转换有不少的缺点,有的时候用C风格的转换是不合适的,因为它可以在任意类型之间进行转换,比如你可以把一个指向const类型的指针转换成指向非const类型的指针,把一个指向基类对象的指针指向派生类对象的指针,这两者之间的转换差距是巨大的,但是传统的C风格的转换没有区分这些。还有一个缺陷,C风格的转换不容易查找,它有一个括号和一个标识符组成,而这样的东西在C++程序中一大堆。所以C++为了克服这些缺陷,引进了四种类型转换操作符。

    1、static_cast

    功能:完成编译器认可的隐式类型转换

    格式: 
      type1 a; 
      type2 b = static_cast(a); //将type1类型转换成type2类型

    使用范围: 
    (1) 基本数据类型之间的转换,如int->double 
      int a = 6; 
      folat b = static_cast(a);

    (2) 基类派生类之间的转换,但只能用于类的指针或者引用之间的转换 
      class base{}; 
      class derived:public base{}; 
      base *b; 
      derived *d = new derived(); 
      b = static_cast<base *>(d)

    2、dynamic_cast 
    功能:基类派生类之间的转换,但只能用于类的指针或者引用之间的转换

    格式: 
    (1) 其他三种都是编译时完成的,dynamic_cast是运行时处理的,运行时需要进行类型检查; 
    (2) 基类中要有虚函数,因为类型检查的类型信息在虚函数表中,有虚函数才会有虚函数表; 
    (3) 可以实现向上转型和向下转型,前提必须使用public或protected继承; 
    例子: 
      class base 
      { 
        virtual void fun(); 
      } 
      class derived:public base 
      { 
        void fun(); 
      } 
      
      base *b; 
      derived *d = new derived(); 
      b = static_cast<base *>(d)

    3、const_cast 
    功能:只能对指针引用去除或者添加const属性,只能改变同种类型的const属性

    常用用法: 
    (1) 常用于函数的形参是一个非const的引用,我想要传进去一个const的引用,可以使用const_cast去除参数的常亮性,以便函数能够接受这个参数; 
    (2) 一个const对象,我们想要调用该对象中的非const函数,可以使用const_cast去除对象的常亮性;

    4、reinterpret_cast 
    从字面意思就是“重新解释的类型转换”。也就是说任意两个类型之间都可以使用使用reinterpret_cast进行类型转换。

    https://blog.csdn.net/u010154685/article/details/51800235

    reinterpret_cast的功能比static_cast的功能更为强大,但安全性也更为的差,可以用它完成C++语法上不允许的 
    转换,在某些情况下程序员有需要的转换。例如,可以把某种引用或指针类型转换为其他引用类型或指针类型(两 
    个类型可以不相关),这个关键字还经常将指针转换为void*,以及将void*转换为指针。

    下面通过代码说明reinterpret_cast的使用:

    #include <iostream>
    
    using namespace std;
    
    //测试int 和 void*的相互转化
    void test_voidpointer(void *data){
        int d = reinterpret_cast<int>(data);
    
        cout << d << endl;
    }
    
    //定义连个无关类A, B
    class A{
    
    };
    
    class B{
    
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        //void* 和in的相互转化,这里应该注意一下64位平台和32位平台指针的大小不同
        test_voidpointer(reinterpret_cast<void *>(20));
    
        //A a;
        B b;
    
        //a = reinterpret_cast<A>(b); //编译通不过,b不知指针或者引用
    
        //下面是指针或引用的转化
        A *pa = reinterpret_cast<A*>(&b);
        A &ra = reinterpret_cast<A&>(b);
    
        system("pause");
        return 0;
    }
    
  • 相关阅读:
    Learning Spark中文版--第三章--RDD编程(1)
    关于learning Spark中文版翻译
    dom4j 常用操作
    Invalid bound statement (not found)
    touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied
    docker 运行tomcat 并部署 java web项目
    docker build no such file or directory
    Docker 笔记
    java 自动拆箱 自动装箱
    Ubuntu18 中文乱码 问题 解决
  • 原文地址:https://www.cnblogs.com/freebird92/p/9316853.html
Copyright © 2020-2023  润新知