共用方式為


static_cast 運算子

將轉換運算式 的型別 型別識別碼只根據出現在運算式中的型別。

static_cast <type-id> ( expression ) 

備註

您可以對任何執行階段型別檢查不進行可協助您確保安全的轉換。

static_cast運算子可用於作業,例如將變數的指標轉換為基底類別衍生類別的指標。 這類轉換並不一定安全。

通常您使用static_cast時您想要轉換的數字資料型別,例如列舉 ints 或 ints 為浮點數,因此您特定的資料型別進行轉換。 static_cast轉換不是做為安全dynamic_cast轉換,因為static_cast並沒有執行階段型別檢查,而dynamic_cast不會。 A dynamic_cast模稜兩可的指標會失敗,而static_cast傳回,好像沒有任何錯誤。 這可能會有危險。 雖然dynamic_cast轉換,是較為安全, dynamic_cast只在指標或參考,然後在執行階段型別檢查的運作方式會造成負擔。 如需詳細資訊,請參閱 dynamic_cast 運算子

在範例中,如下所列D* pd2 = static_cast<D*>(pb);並不安全因為D可以有欄位和方法不在B。 不過,線條B* pb2 = static_cast<B*>(pd);是一個安全的轉換,因為D一定會包含所有的B。

// static_cast_Operator.cpp
// compile with: /LD
class B {};

class D : public B {};

void f(B* pb, D* pd) {
   D* pd2 = static_cast<D*>(pb);   // Not safe, D can have fields
                                   // and methods that are not in B.

   B* pb2 = static_cast<B*>(pd);   // Safe conversion, D always
                                   // contains all of B.
}

相較之下, dynamic_cast,不會執行階段檢查在進行static_cast轉換的pb。 指向物件pb可能不是型別的物件D,在此情況下使用*pd2可能會很慘重。 舉個例說,呼叫函式屬於D類別,但不是B類別,可能會導致存取違規。

dynamic_cast和static_cast運算子會將整個類別階層架構的指標。 不過, static_cast是以獨佔方式在型別轉換陳述式中所提供的資訊,而因此可能不安全。 例如:

// static_cast_Operator_2.cpp
// compile with: /LD /GR
class B {
public:
   virtual void Test(){}
};
class D : public B {};

void f(B* pb) {
   D* pd1 = dynamic_cast<D*>(pb);
   D* pd2 = static_cast<D*>(pb);
}

如果pb真的型別的物件會指向D,然後pd1和pd2會得到相同的值。 它們也會得到相同的值,如果pb == 0。

如果pb型別的物件會指向B ,而非完整D類別,然後dynamic_cast將會足夠知識可以傳回零。 不過, static_cast必須藉助程式設計人員的判斷提示的pb型別的物件會指向D ,就會回到變數的指標,應該D物件。

因此, static_cast可以隱含轉換的反函數值,在此情況下,結果是未定義。 再由程式設計人員,以確認結果的static_cast轉換都很安全。

這種情形也適用於型別不是類別型別。 舉個例說, static_cast可以用於轉換為 int char。 然而,所產生的char可能沒有足夠的位元,以容納整個int的值。 同樣地,它就交給程式設計人員,以確認結果的static_cast轉換都很安全。

static_cast運算子也可用來執行任何的隱含轉換,包括標準的轉換和使用者定義轉換。 例如:

// static_cast_Operator_3.cpp
// compile with: /LD /GR
typedef unsigned char BYTE;

void f() {
   char ch;
   int i = 65;
   float f = 2.5;
   double dbl;

   ch = static_cast<char>(i);   // int to char
   dbl = static_cast<double>(f);   // float to double
   i = static_cast<BYTE>(ch);
}

static_cast運算子可以明確地將一個整數值轉換成列舉型別。 如果整數類資料型別的值未落在列舉型別值的範圍內,所產生的列舉型別值未定義的。

static_cast運算子將 null 指標值轉換成目的型別時發現 null 指標值。

任何運算式明確轉換為型別 void 的static_cast運算子。 目的 void 型別可以選擇性地納入const, volatile,或__unaligned屬性。

static_cast運算子無法轉換開const, volatile,或__unaligned屬性。 請參閱 const_cast 運算子如需移除這些屬性的詳細資訊。

執行未檢查的轉換 (cast) 在 relocating 的記憶體回收行程,使用的最上層的危險受限於static_cast只在重視效能的程式碼時,應該確定它能正常運作。 如果您必須使用static_cast在發行模式中,取代safe_cast在偵錯組建中,以確保成功。

請參閱

參考

轉型運算子

C + + 關鍵字