c++ cast and conversion

c++ cast and conversion

conversion

Implicit conversion

  • 編譯器會嘗試以妥善定義的順序進行轉換,直到其中一個成功為止
  • Standard conversions affect fundamental data types, and allow the conversions between numerical types (short to int, int to float, double to int…), to or from bool, and some pointer conversions.

    擴大轉換 (升級)

  • 較小變數中的值會指派給較大的變數,而不會遺失任何資料。
  • 因為擴輾轉換一律是安全的,所以編譯器會以無訊息方式執行這些轉換,而且不會發出警告
寄件者 收件者
除了或以外 long long 的任何 signedunsigned 整數類型**__int64** double
boolchar 任何其他內建類型
shortwchar_t int, long, long long
int, long long long
float double

縮小轉換 (強制)

  • 編譯器會以隱含方式執行縮小轉換,但會警告您可能遺失資料

    explicit conversion

    1
    2
    (int) x; // old-style cast, old-style syntax
    int(x); // old-style cast, functional syntax

    cast function

    dynamic_cast

  • dynamic_cast 只能够用在指向类的指针或者引用上(或者void*)。这种转换的目的是确保目标指针类型所指向的是一个有效且完整的对象。
    • 允许upcast, dynamic_cast
  • 注意:在上面例子中的dynamic_cast 需要用到RTTI(Run-Time Type Identification);在一些支持此特性但是默认是关闭的编译器上需要额外打开。

static_cast

  • static_cast 能够完成指向相关类的指针上的转换。
    • upcast 和downcast 都能够支持,但不同的是,并不会有运行时的检查来确保转换到目标类型上的指针所指向的对象有效且完整。
    • 因此,这就完全依赖程序员来确保转换的安全性。但反过来说,这也不会带来额外检查的开销。

      reinterpret_cast

  • reinterpret_cast 能够完成任意指针类型向任意指针类型的转换,即使它们毫无关联。
  • 该转换的操作结果是出现一份完全相同的二进制复制品,既不会有指向内容的检查,也不会有指针本身类型的检查。
  • 基本上 reinterpret_cast 能做但 static_cast 不能做的转换大多都是一些基于重新解释二进制的底层操作,因此会导致代码限定于特定的平台进而导致差移植性。

    const_cast

  • const_cast可以用来设置或者移除指针所指向对象的const

    reference

  • C++的cast有四种cast法 - 知乎
  • 類型轉換與類型安全 | Microsoft Docs
  • Type conversions - C++ Tutorials