zoukankan      html  css  js  c++  java
  • 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这种运行时进行类型识别而导致效率低的操作;

  • 相关阅读:
    【乱侃】How do they look them ?
    【softeware】Messy code,some bug of Youdao notebook in EN win7
    【随谈】designing the login page of our project
    【web】Ad in security code, making good use of resource
    SQL数据库内存设置篇
    关系数据库的查询优化策略
    利用SQL未公开的存储过程实现分页
    sql语句总结
    sql中使用cmd命令注销登录用户
    SQLServer 分页存储过程
  • 原文地址:https://www.cnblogs.com/reasno/p/4771836.html
Copyright © 2011-2022 走看看