根據表達式中存在的類型,將表達式轉換成類型標識符的類型。
語法
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_cast 的pb轉換進行運行時間檢查。
pb 所指向的物件可能不是 D 類型的物件,在此情況下,使用 *pd2 可能會得不償失。 例如,呼叫屬於 D 類別但不屬於 B 類別的成員函式時,可能會造成存取違規。
dynamic_cast和 static_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 類型的物件,則 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 指標值。
任何表達式都可以由 static_cast 運算子明確轉換成 void 類型。 目的地 void 類型可以選擇性地包含 const、 volatile或 __unaligned 屬性。
運算子 static_cast 無法轉換 const、 volatile或 __unaligned 屬性。 如需移除這些屬性的相關信息,請參閱 const_cast 運算符 。
C++/CLI: 由於在重新定位垃圾收集行程上執行未檢查的轉換的危險, static_cast 因此使用 應該只在確定其正常運作時才會在效能關鍵程序代碼中。 如果您必須在發行模式中使用 static_cast ,請在偵錯組建中以 safe_cast 取代它,以確保成功。