Aracılığıyla paylaş


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.

Ayrıca bkz.

Başvuru

Atama operatörleri

C++ anahtar sözcükler