C++类型转换

来源:互联网 发布:网络基础知识面试题 编辑:程序博客网 时间:2024/06/06 01:48
1. 隐式类型转换
1) 算数转换:在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型
2) 赋值转换:目标类型是被赋值对象的类型
3) 参数传递转换:形参和实参类型不一致:目标转换类型为形参的类型
4) 函数返回值转换:目标转换类型为函数的返回类型

2. 显式类型转换(强制类型转换)
    C  风格:(type)expression
    C++风格:cast-name<type>expression
    cast-name包含static_cast、dynamic_cast、const_cast、reinterpret_cast

    1) static_cast:把expression转换为type类型,但没有运行时类型检查来保证转换的安全性
    主要有如下几种用法:
        a) 用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成子类指针或引用)时,由于没有动态类型检查,所以是不安全的。
        b) 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
        c) 把void指针转换成目标类型的指针(不安全!!)
        d) 把任何类型的表达式转换成void类型
 
        static_cast不能转换掉expression的const、volitale、或者__unaligned属性

    2) dynamic_cast:把expression转换成type类型的对象。type必须是类的指针、类的引用或者void *;如果type是类指针类型,那么expression也必须是一个指针,如果type是一个引用,那么expression也必须是一个引用
        主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换
        在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全

    3) const_cast:用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type和expression的类型是一样的

    4) reinpreter_cast:将数据从一种类型的转换为另一种类型。所谓“通常为操作数的位模式提供较低层的重新解释”也就是说将数据以二进制存在形式的重新解释
     例:将指针p的值以二进制(位模式)的方式被解释为整型,并赋给i
     int i;
     char *p = "Thisisanexample.";
     i = reinterpret_cast<int>(p);
0 0
原创粉丝点击