static_cast operátora
Převede výraz druhu id typu založené pouze na typy, které jsou přítomny ve výrazu.
static_cast <type-id> ( expression )
Poznámky
Zajistit bezpečnost převod provedena žádná kontrola typu v době spuštění.
static_cast Operátor lze použít pro operace, jako je převod ukazatel na základní třídy ukazatel odvozené třídy.Tyto převody jsou vždy bezpečné.
Obecné použití static_cast Pokud chcete převést číselné typy, výčty jako opisky nebo opisky plovácích, a některé typy dat účastní převodu.static_castpřevody jsou stejně bezpečné jako dynamic_cast převody, protože static_cast kontrola typu v době spuštění, zatímco dynamic_cast nemá.A dynamic_cast dvojznačný ukazatel se nezdaří, zatímco static_cast vrátí, jako kdyby nic nesprávné; To může být nebezpečné.Přestože dynamic_cast převody jsou bezpečnější, dynamic_cast pouze režijní děl na ukazatele nebo odkazy a kontrola typu v době spuštění.Další informace naleznete v tématu dynamic_cast operátora.
V následujícím příkladu, řádek D* pd2 = static_cast<D*>(pb); není bezpečné protože D může mít pole a metody, které nejsou v B.Však řádek B* pb2 = static_cast<B*>(pd); je bezpečné převodu, protože D vždy obsahuje všechny 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.
}
Oproti dynamic_cast, žádné kontrole běhu static_cast převodu pb.Objekt odkazuje pb nemusí být objekt typu D, v případě použití *pd2 může být katastrofální.Například volání funkce, která je členem D třídy, ale B třídy, může vést k narušení přístupu.
dynamic_cast a static_cast operátory ukazatel v celé hierarchie třídy.Však static_cast spoléhá výhradně na informace uvedené v prohlášení osazení a proto může nebezpečné.Příklad:
// 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);
}
Pokud pb ve skutečnosti odkazuje na objekt typu D, pak pd1 a pd2 získá stejnou hodnotu.Také získají stejnou hodnotu Pokud pb == 0.
Pokud pb odkazuje na objekt typu B a úplnou D třídy pak dynamic_cast vědět dost vrátí nulu.Však static_cast závisí na uplatnění programátora, pb odkazuje na objekt typu D a jednoduše vrátí ukazatel, který by měl D objektu.
V důsledku toho static_cast můžete provést inverzní implicitní převody, v takovém případě nejsou výsledky definovány.Je ponecháno programátor ověřit, zda výsledky static_cast převodu jsou bezpečné.
Toto chování se týká i jiných typů než typů třídy.Například static_cast lze převést na int char.Však výsledný char , není pravděpodobně dostatek bitů k uložení celé int hodnotu.Znovu jej zleva programátor ověřit, zda výsledkystatic_cast převodu jsou bezpečné.
static_cast Operátor lze také provést implicitní převod, včetně standardních převodech a uživatelem definované převody.Příklad:
// 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 Explicitně převést integrální hodnota výčtu typu operátor.Pokud hodnota integrálního typu nespadá do rozsahu hodnot výčtu, výsledná hodnota výčtu nedefinovaná.
static_cast Operátor převede hodnotu ukazatele null na hodnotu typu cílového ukazatele null.
Jakýkoli výraz explicitně převést na typ void podle static_cast operátor.Neplatný typ cíle můžete volitelně zahrnout const, volatile, nebo __unaligned atributu.
static_cast Operátor nelze přetypovat pryč const, volatile, nebo __unaligned atributy.Viz const_cast operátor informace o odebrání těchto atributů.
Vzhledem k nebezpečí provádění Nekontrolovaná nádech nahoře relocating kolekcí odpadků, použití static_cast by měl být pouze v kódu výkonu kritické když jste si jisti, bude fungovat správně.Pokud je nutné použít static_cast vydání režim nahradit jej s safe_cast v sestavení vašeho ladění zajistit úspěch.