static_cast 運算子

根據運算式中存在的類型, 將運算式 轉換成類型識別碼的類型

語法

static_cast <type-id> ( expression )

備註

標準 C++ 不會利用執行階段類型檢查來確認轉換是否安全。 在 C++/CX 中會執行編譯時期和執行階段檢查。 如需詳細資訊,請參閱 轉型中定義的介面的私用 C++ 專屬實作。

static_cast運算子可用於將指標轉換為衍生類別指標等作業。 這類轉換不一定一直都是安全的。

一般而言,當您想要將數值資料類型,例如列舉轉換成 ints 或 ints 轉換為 float 時,您會使用 static_cast ,而且您是轉換所涉及的資料類型。 static_cast 轉換不如 dynamic_cast 轉換那麼安全,因為 static_cast 不會進行執行時間類型檢查,但 dynamic_cast 不會執行。 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_castpb 轉換進行執行時間檢查。 pb 所指向的物件可能不是 D 類型的物件,在此情況下,使用 *pd2 可能會得不償失。 例如,呼叫屬於 D 類別但不屬於 B 類別的成員函式時,可能會造成存取違規。

dynamic_caststatic_cast 運算子會在整個類別階層中移動指標。 不過, static_cast 完全依賴 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 類型的物件,則 pd1pd2 會取得相同的值。 如果 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 指標值。

任何運算式都可以由 static_cast 運算子明確轉換成 void 類型。 目的地 void 類型可以選擇性地包含 constvolatile__unaligned 屬性。

運算子 static_cast 無法轉換 constvolatile__unaligned 屬性。 如需移除這些屬性的相關資訊,請參閱 const_cast 運算子

C++/CLI: 由於在重新放置垃圾收集行程之上執行未核取的轉換的危險, static_cast 使用 應該只在確定其正常運作時才會在效能關鍵程式碼中。 如果您必須在發行模式中使用 static_cast ,請在偵錯組建中以 safe_cast 取代它,以確保成功。

另請參閱

轉型運算子
關鍵字