static_cast operatörü
Dönüştüren bir ifade türüne türü kimliği, deyimde bulunan türleri temel.
static_cast <type-id> ( expression )
Notlar
Çalışma zamanı tür Denetimsiz dönüştürme güvenliğini sağlamaya yardımcı olmak için yapılır.
static_cast İşleci, bir temel sınıf türetilmiş bir sınıf için bir işaretçi için işaretçiyi dönüştürme gibi işlemler için kullanılabilir. Tür dönüştürmeleri her zaman güvenli değildir.
Genel olarak kullandığınız static_cast numaralandırmalar gibi sayısal veri türü ints ints gösterildiði ve dönüştürmek istediğiniz zaman belirli veri türleri dönüştürme ilgilidir. static_castDönüşümleri olarak güvenli olmayan dynamic_cast dönüşümleri, çünkü static_cast hiçbir çalışma zamanı tür denetimi yapmaz, while dynamic_cast yapar. A dynamic_cast belirsiz bir işaretçi başarısız olur, ancak bir static_cast hiçbir şey yanlış; olarak döndürür Bu tehlikeli olabilir. Ancak dynamic_cast dönüşümleri daha güvenli, dynamic_cast işaretçileri veya başvuruları ve çalışma zamanı tür onay works yalnızca bir ek yük. Daha fazla bilgi için bkz. dynamic_cast operatörü.
Satır aşağıdaki örnekte D* pd2 = static_cast<D*>(pb); güvenli değil çünkü D alanları ve olmayan yöntemleri olabilir B. Ancak, satır B* pb2 = static_cast<B*>(pd); , çünkü güvenli dönüşümü D her zaman tüm içeren 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.
}
Aksine dynamic_cast, çalışma zamanı Denetimsiz üzerinde yapılan static_cast dönüştürme pb. Nesneyi işaret için tarafından pb türünde bir nesne olmayabilir D, durumda kullanımını *pd2 neden olabilir. Örneğin, bir işlevi çağıran bir üyesi olan D sınıf değil, B sınıfı, bir erişim ihlaline neden olabilir.
dynamic_cast Ve static_cast işleçleri bir işaretçi bir sınıf hiyerarşisi boyunca taşıyın. Ancak, static_cast özellikle cast deyiminde sağlanan bilgileri kullanır ve bu nedenle güvensiz olabilir. Örne?in:
// 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 Gerçekten türünde bir nesneye işaret eden D, sonra pd1 ve pd2 aynı değeri elde edersiniz. Bunlar da aynı değeri alırsınız pb == 0.
pb Türünde bir nesneye işaret B ve tam D sınıfı, daha sonra dynamic_cast sıfır dönmek için yeterli bilirsiniz. Ancak, static_cast Programcı onaylama işlemi kullanır, pb türünde bir nesneye işaret D ve beklenen, basitçe bir işaretçi döndürür D nesne.
Sonuç olarak, static_cast örtük dönüştürmeler tersini yapmak için sonuçlar durumda tanımsız olur. Sonuçları doğrulamak için Programcı sol bir static_cast dönüştürme güvenli.
Bu davranış, sınıf türleri dışındaki türler için de geçerlidir. Örneğin, static_cast int'den dönüştürmek için kullanılan bir char. Ancak, ortaya çıkan char tüm tutacak yeterli miktarda bit olmayabilir int değeri. Yeniden sonuçları doğrulamak için Programcı sol birstatic_cast dönüştürme güvenli.
static_cast İşleci de standart dönüşümler ve kullanıcı tanımlı dönüştürme de dahil olmak üzere herhangi bir örtük dönüştürme gerçekleştirmek için kullanılabilir. Örne?in:
// 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 İşleci bir tam sayı değeri açıkça bir numaralandırma türü dönüştürebilirsiniz. Tamsayı türü değerini numaralandırma değerleri aralığında uymazsa, ortaya çıkan numaralandırma değeri tanımlı değil.
static_cast İşleci bir null işaretçi değeri hedef türü işaretçi null değerine dönüştürür.
Herhangi bir ifade tarafından void türü için açıkça dönüştürülebilir static_cast işleci. İsteğe bağlı olarak hedef void türü içerebilir const, volatile, veya __unaligned özniteliği.
static_cast Operatör olamaz artığını hemen const, volatile, veya __unaligned öznitelikleri. Bkz: const_cast işleç bu öznitelikleri kaldırma hakkında bilgi için.
Relocating bir çöp toplayıcı kullanımını üstte denetlenmeyen yayınları gerçekleştirme tehlike yüzünden static_cast düzgün çalışır emin olduğunuzda yalnızca kritik performans kodu olmalıdır. Kullanmanız gerekiyorsa static_cast ile yayın modunda yerine safe_cast başarıyı garantilemek için hata ayıklama yapılar içinde.