zoukankan      html  css  js  c++  java
  • C++类型转换的注意事项

    1、如果两个类型可以相互转换,就说他们是关联的。

    2、隐式转换是指,由编译器自行转换,而不需要程序员介入的转换。

    3、以下情况,编译器会发生隐式转换:

      1)在大多数表达式中,比int类型小的整型值会被提升为较大的整型值。

      2)在条件语句中,非布尔类型会被转换成布尔类型。

      3)初始化过程中,初始值的类型转换成变量的类型时,赋值运算符的右侧运算对象的类型会被转换成左侧 运算对象的类型。

      4)如果算术运算符或关系运算符的运算对象有多种类型,需要转换成同一种类型。

      5)函数调用,也会发生类型转换。

    4、算术转换的规则,就是运算符的运算对象不管是什么类型,都会被转换成最宽的那个类型。例如,如果有一个运算对象的类型是long double,那么不管另一个运算的对象的类型是什么,都会被转换成long double。

    5、整型提升,就是把较小的整型数类型转换成较大的整型数类型,对于比int类型小的整数类型,都会被提升为int类型,否则,提升为unsigned int。而较大的char类型会被提升为int、unsigned int、long、unsigned long、long long和unsigned long long中的最小的一种类型。

    6、其他的隐式转换:1)数组转换成指针,大多数情况下,数组会自动转换成指针类型,但是如果是decltype关键字的参数,取地址运算符,sizeof运算符及typeid运算符的运算对象时,不会转换,并且如果使用一个引用去初始化数组,也不会转换。

               2)指针的转换,常量整数值0、字面值nullptr都能转换成任意指针类型,指向任意非常量对象都能转换为void *类型,指向任意对象的指针都能转换为const void*类型。

                a)指针还能转换成bool类型,如果指针的值为0,则转换结果为false,否则为true;

                b) 转换成常量,允许一个指向非常量的指针或者引用转换成一个指向常量的指针,不存在相反的转换。

               3)类类型的定义的转换,类类型能定义由编译器自动执行的转换,不过编译器每次只能执行一种类类型的转换。

    7、 一般情况下使用强制类型转换是非常危险的。

    8、新标准下,命名的强制转换形式:cast-name<type>(expression);  type是要转换成的目标类型,而expression是要转换的值。若type是引用类型,则其结果是左值。其中cast-name是static_cast、dynamic_cast、const_cast和reinterpret_cast中的一种。

    9、dynamic_cast支持运行时识别。任何具有明确定义的类型的转换,只要不包含底层Const,都可以使用static_cast。并且前面说到不能访问void*指针,但是通过static_cast强制转换可以将其转换成普通指针。注意,强制转换前后指针的值保持不变,并且转换前后指针所指的类型必须保持一致,否则会出现未定义的行为。

    10、const_cast只能改变运算对象底层const,一般用于转换常量对象为非常量对象,也就是有去掉const的性质

    11、reinterpret_cast为运算对象的位模式上提供较低层次的重新解释。其本质上依赖于机器,也就是说要对涉及类型和编译器实现类型转换的过程都非常的了解。

    12、《C++ primer fifth》建议我们避免使用强制类型转换,因为强制类型转换干扰了编译器正常的类型检查,在实际的编程中,应该对强制类型转换的类型做个记录,以便于发生错误时查找。

    13、早期版本的C++,有两种强制类型转换,一种是type(expr),一种是(type)expr,前者是函数形式的强制类型转换,后者是C语言风格的强制类型转换。

    14、可以使用static_cast和const_cast替换旧版本的强制转换类型,若合法,则其行为与对应的命名转换一致。若替换后,不合法,则旧式强制类型转换与reinterpret_cast类似的功能。

    15、旧式的类型转换与命名的强制类型转换的区别在于,旧式类型转换的表现形式不那么清晰,一旦转换出现问题,很难追踪。

  • 相关阅读:
    7-3色彩平衡
    Flex 布局
    JS获取当前周
    虚树学习笔记
    当然,perl等脚本服务器是一般默认安装了,你入侵了一台主机,总不能先装配 Java 环境然后再开干吧?
    还有这种书,程序开发心理学(豆瓣)
    Codeforces Round #143 (Div. 2)
    Codeforces Round #142 (Div. 2)
    Codeforces Round #141 (Div. 2)
    2018-2019-1 20189221 书籍速读 第 1 周
  • 原文地址:https://www.cnblogs.com/Dark-King/p/9451640.html
Copyright © 2011-2022 走看看