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_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 取代它,以確保成功。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將推出:在 2024 年,我們將隨著內容的意見反應機制逐步淘汰 GitHub 問題,並以新的意見反應系統來取代。 如需詳細資訊,請參閱提交並檢視相關的意見反應