Sdílet prostřednictvím


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.

Viz také

Referenční dokumentace

Obsazení operátory

Klíčových slov jazyka C++