• C++类型转换


      C++有4种类型转换,分别为:const_cast,static_cast,dynamic_cast,reinterpret_cast;下面结合代码分别介绍4种类型转换。

    const_cast:

      去掉类型的const属性,将const变量转为非const变量

     1 const int a;
     2 
     3 //直接修改const类型变量的值,编译错误
     4 //a = 10; 
     5 
     6 //去除const属性,并转换为int&类型
     7 int &b = const_cast<int&>(a);
     8 
     9 //可以对其值进行修改
    10 b = 10;

    static_cast:

    类似于C语言的强制类型转换,用于各种隐式转换。

      父类指针子类指针之间的转换:子类指针转换为父类指针(向上转换安全),父类指针转换为子类指针(向下转换不安全);基本数据类型转换;任何类型转换成void类型非const类型转换为const类型,但是不能去掉类型的const属性。

     1 B* b = new B();
     2 //子类(B)指针转换为父类(A)指针,安全
     3 A* a = static_cast<A*>(b);
     4 
     5 int n = 10;
     6 //基本数据类型转换
     7 double d = static_cast<double>(n);     
     8 
     9 int *pn = &n;
    10 //任意数据类型转换为void类型
    11 void *p = static_cast<void*>(pn);
    12 
    13 int a=10;
    14 //非const类型转换为const类型
    15 const int b=static_cast<const int>(a);

    dynamic_cast:

    用于动态类型转换,运行时检查类型安全(转换失败返回NULL)。

      父类指针子类指针之间的转换,向上向下转换均为安全的且只能用于含有虚函数的类。

     1 //A类为父类,B类为子类,且含有虚函数
     2 
     3 B* pb = new B();
     4 //子类(B)指针转换为父类(A)指针,静态类型转换,不进行安全检查
     5 A* ps1 = static_cast<A*>(pb);  
     6 //子类(B)指针转换为父类(A)指针,动态类型转换,进行安全检查
     7 A* ps2 = dynamic_cast<A*>(pb); 
     8 
     9 A* pb2 = new A();
    10 //父类(A)指针转换为子类(B)指针,静态类型转换,危险、
    11 //当访问子类有而父类没有的成员时出错
    12 B* ps21 = static_cast<B*>(pb2);
    13 //父类(A)指针转换为子类(B)指针,动态类型转换,安全,结果为NULL
    14 B* ps22 = dynamic_cast<B*>(pb2);

    reinterpret_cast:

    几乎什么都可以转(如int类型转换为指针类型),尽量少用。

    相关链接

    C++智能指针 https://www.cnblogs.com/yongjin-hou/p/14394429.html

  • 相关阅读:
    写了一个html5音乐播放器
    跨站脚本攻击之反射型XSS漏洞
    org.hibernate.ObjectNotFoundException异常一则
    addEventListener第二个参数的handleEvent
    IE的fireEvent方法
    DexMongoDB索引优化工具
    javascript 位运算符
    javascript contains方法来判断元素包含关系
    将uglifyjs添加到鼠标右键菜单
    过滤XSS(跨站脚本攻击)的函数和防止svn版本库被浏览
  • 原文地址:https://www.cnblogs.com/yongjin-hou/p/14391180.html
Copyright © 2020-2023  润新知