• Effective C++ 条款27 尽量少做转型操作


    1. 转型语法有三种,

    C风格转型:(T)expression

    函数风格转型:T(expression)

    两种方式除了小括号位置不同没有差别,可以称为"旧式转型".

    C++提供四种新式转型:   

    const_cast<T>(expression):

        将const变量引用或指针转为非const引用或指针,移除变量的常量特性.T必须是指针或引用.

        注:虽然经const_cast转型后的变量可以被更改,但由于"常量折叠"(c++编译器在编译时将const 变量替换为对应常量),原变量的值表现出未更改的性质(只有内置类型才会有这种现象).

    reinterpret_cast<T>(expression):

        变量二进制位层次上的重新解释,并没有对变量的二进制储存方式进行更改.T必须是指针,引用或算术类型.

    dynamic_cast<T>(expression):

        在执行期进行多态类(有虚函数)之间的转换,用于运行时类型识别.T必须是指针或引用,expression必须返回多态类类型.

        如果T是指针,转换失败时会返回NULL,如果T是引用,转换失败时会抛出异常.

    static_cast<T>(expression):

        可以执行大多数类型的转换,但与const_cast类型相比,static_cast不能去除const或volatile属性,与dynamic_cast相比不支持运行时类型识别,与reinterpret_cast相比不是位层次上的重新解释,而是对位进行改变后的重新编码.

    2. static_cast与返回值的函数类似,返回的是一个临时副本,例如:

    int a;
    static_cast<double>(a)=2.0;

    并不会改变a的值,因此除非像dynamic_cast,const_cast一样转为指针和引用,否则不要对转换后的对象进行操作.

    此外,dynamic_cast在成功进行downcast或upcast时会进行指针地址的重定向(这由C++面向对象模型决定),因此dynamic_cast与static_cast在进行类类型之间的转换上操作也有所不同.

    3. 尽量使用C++的新式转型操作取代C的旧式转型,前者分类更加精确,可以明确指出转型意图,便于找出错误.

    如果可以,尽量避免转型操作,特别是避免像dynamic_cast这种运行时进行类型识别而导致效率低的操作;

  • 相关阅读:
    全景3d
    node.JS
    同步、异步
    必填
    this.$http.post ||this.$http.put||vue 获取url参
    硬编码转换单位||vue
    路由下二级跳转: childen 的childen
    vue侧边栏导航和右边内容一样高
    v-for v-if || v-else
    Python_Automation_04Email_smtplib
  • 原文地址:https://www.cnblogs.com/reasno/p/4771836.html
Copyright © 2020-2023  润新知