在 C++ 中使用 static_cast 命令

Jinku Hu 2023年1月30日 2021年6月28日
  1. 使用 static_cast 顯式轉換 C++ 中的物件型別
  2. 使用 reinterpret_cast 在 C++ 中顯式轉換物件型別
在 C++ 中使用 static_cast 命令

本文將演示如何在 C++ 中使用 static_cast 的多種方法。

使用 static_cast 顯式轉換 C++ 中的物件型別

將物件轉換為不同型別的操作稱為 casting。根據語言規則,在 C++ 中存在隱式轉換髮生的情況,例如,陣列到指標衰減。儘管如此,轉換主要與使用者發出的顯式轉換請求相關聯。當我們將物件或表示式的值轉換為不同型別時,我們強制編譯器將給定型別與指向該物件的指標相關聯。

有四種命名的顯式轉換操作:const_caststatic_castreinterpret_castdynamic_cast。這些操作是現代 C++ 語言的原生操作,並且比舊的 C 樣式轉換相對可讀。強制轉換通常是危險的,即使是有經驗的程式設計師也會犯錯誤,但在必要時不應該阻止你使用這些轉換操作。在本文中,我們僅概述 static_castreinterpret_cast 操作。

static_cast 函式通常用於將相關型別作為相同類層次結構或數字型別的指標相互轉換。此命令還處理由建構函式和轉換運算子定義的轉換。請注意,main 函式中的第二行實際上是執行從有符號 char 到有符號整數的隱式轉換,這只是下一行的隱藏版本。

這是在當代 C++ 中進行轉換的推薦方法,即使結果是相同的。另一方面,main 函式的第四和第五行不是使用 static_cast 操作的有效轉換。雖然,我們可以使用 C 風格的強制轉換,(int*)x,它以十六進位制形式和記憶體地址表示法列印 97 整數值。請注意,此操作很可能會生成編譯器警告。

#include <iostream>

using std::cout; using std::endl;

int main() {
    char x = 'a';
    int x_i = x;
    int x_ii = static_cast<int>(x);
    int* x_iii = static_cast<int*>(x); // ERROR
    int* x_iii = static_cast<int*>(&x); // ERROR
    int* x_iii = (int*)x; // WARNING

    cout << x << endl;
    cout << x_i << endl;
    cout << x_ii << endl;
    cout << x_iii << endl;

    return EXIT_SUCCESS;
}

輸出:

a
97
97
0x61
0x7ffeb7c31997

使用 reinterpret_cast 在 C++ 中顯式轉換物件型別

或者,可以使用以下程式碼示例中顯示的 reinterpret_cast 操作完成後一種 C 樣式轉換。此方法將使編譯器警告靜音,並且使用者可以對轉換負責。我們可以使用 reinterpret_cast 將不同的指標型別轉換為 char*int*

在這種情況下,列印的地址與儲存 x 字元的地址相同。請記住,如果我們取消引用 x_iii 指標以訪問該值,我們將不會得到字元 a 或其 ASCII 替代,而是一個奇怪的整數。該整數是從同一位置檢索的。只有資料型別的大小不同,因為它被解釋為 int

#include <iostream>

using std::cout; using std::endl;

int main() {
    char x = 'a';
    int* x_i = (int*)x; // WARNING
    int* x_ii = reinterpret_cast<int*>(x);
    int* x_iii = reinterpret_cast<int*>(&x);

    cout << x_i << endl;
    cout << x_ii << endl;
    cout << x_iii << endl;

    return EXIT_SUCCESS;
}

輸出:

0x61
0x61
0x7ffca18be95f
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C++ Cast