2009-08-28 19 views
7

Chcę wiedzieć, co to jest sprawdzanie typu statycznego i dynamicznego oraz różnice między nimi.Sprawdzanie typu statycznego i dynamicznego w C++

+2

c'mon ... 3rd na google: http://www.sitepoint.com/article/typing-versus-dynamic-typing/ ... ten rep-program naprawdę sponsoruje zadawanie wszelkiego rodzaju pytań. ..> westchnienie < – jpinto3912

+7

Celem stackoverflow jest stać się repozytorium całej wiedzy programistycznej, nawet jeśli istnieje gdzie indziej. –

+7

Znam go gdzieś w google, ale tutaj masz wiele definicji, które pomagają ci zrozumieć w bardziej przejrzysty sposób – rkb

Odpowiedz

15

Statyczna kontrola typów oznacza, że ​​sprawdzanie typu następuje w czasie kompilacji. W tym przypadku w środowisku uruchomieniowym nie są używane żadne informacje o typie.

Dynamiczne sprawdzanie typu pojawia się, gdy informacje o typie są używane w czasie wykonywania. C++ używa mechanizmu zwanego RTTI (informacja o typie środowiska wykonawczego) do zaimplementowania tego. Najczęstszym przykładem, gdzie stosowany jest RTTI jest operatorem dynamic_cast który umożliwia rzutowanie w dół polimorficznych typów:

// assuming that Circle derives from Shape... 
Shape *shape = new Circle(50); 
Circle *circle = dynamic_cast<Circle*> shape; 

Ponadto, można użyć operatora typeid, aby dowiedzieć się o rodzaju wykonawczego obiektów. Można na przykład użyć go do sprawdzenia, czy kształt w tym przykładzie to okrąg lub prostokąt. Oto niektóre further information.

+3

Warto zauważyć, że static_cast jest całkowicie poprawny w powyższym, prostym przykładzie. dynamic_cast powinno być używane tylko wtedy, gdy nie masz pewności, że kształt jest typu Circle, w takim przypadku dynamic_cast zwróci wartość NULL (lub wyrzuci wyjątek, jeśli rzutujesz referencję). –

0

Statyczne sprawdzanie typu to sprawdzanie typu wykonywane w czasie kompilacji. Jest to jedyny typ sprawdzania typu, który wykonuje C++. Dynamiczne sprawdzanie typu to sprawdzanie typu wykonywane w czasie wykonywania. Zwykle jest to widoczne w dynamicznych językach interpretowanych, ale jest mniej powszechne w językach kompilowanych. Ostatni sprawdziłem, C++ nie wykonuje żadnej dynamicznej kontroli typów.

Edytuj: Wygląda na to, że jestem nieaktualny. Zobacz komentarz Reeda poniżej.

+8

dynamic_cast istnieje w C++ i wykonuje sprawdzanie typu czasu działania w wielu środowiskach wykonawczych C++. –

+0

Stoję poprawiony :) Dzięki! –

2

Istnieje wiele typów rzutowania dostępnych w C++.

Najpopularniejszym byłoby użycie static_cast w celu rzutowania zmiennej z jednego rodzaju wskaźnika na inny. Można jednak użyć także dynamic_cast, która sprawdzi, czy (w czasie wykonywania) wskaźniki są poprawnego typu. Jeśli zmienna dynamic_cast ma nieprawidłowy typ, w czasie wykonywania zwraca wartość 0.

// Assume these classes exist 
// class A 
// class B 
// class C : B 

C* c = new C(); 
A* a = new A(); 

B* b = static_cast<B*>(a); // this will work! 
b = dynamic_cast<B*>(a); // b == NULL 
b = dynamic_cast<B*>(c); // b is valid 
+0

"B * b = static_cast (a); // to zadziała!": Nie powinieneś lepiej komentować tego jako "to się skompiluje i otrzymasz wskaźnik NIE ZNACZNY, ale to niekoniecznie zadziała!"? – mmmmmmmm

+0

Myślę, że faktycznie static_cast działa tylko dla powiązanych typów i odmówi kompilacji, reinterpret_cast będzie potrzebny w tym przypadku. Te przykłady wyglądają na wszystkie pomieszane. –

3

C++ mają bardzo niewielkie wsparcie dla dynamicznej kontroli jednego typu jest przez dynamic_cast i drugi jest przez type id .Both mogą być stosowane tylko wtedy, gdy wsparcie RTTI jest włączony kompilator.

TYPE& dynamic_cast<TYPE&> (object); 
TYPE* dynamic_cast<TYPE*> (object); 

Słowo kluczowe dynamic_cast rzuca punkt odniesienia z jednego wskaźnika lub odniesienia do innego typu, przeprowadza kontrolę wykonania w celu zapewnienia ważności obsady.

Jeśli spróbujesz rzutować na wskaźnik na typ, który nie jest typem rzeczywistego obiektu, wynik rzutowania będzie NULL. W przypadku próby rzutowania na odniesienie do typu, który nie jest typem rzeczywistego obiektu, rzut rzuci wyjątek bad_cast.

Upewnij się, że jest co najmniej jedna wirtualna funkcja w klasie bazowej, aby dynamiczne działanie.

// expre_typeid_Operator.cpp 
// compile with: /GR /EHsc 
#include <iostream> 
#include <typeinfo.h> 

class Base { 
public: 
    virtual void vvfunc() {} 
}; 

class Derived : public Base {}; 

using namespace std; 
int main() { 
    Derived* pd = new Derived; 
    Base* pb = pd; 
    cout << typeid(pb).name() << endl; //prints "class Base *" 
    cout << typeid(*pb).name() << endl; //prints "class Derived" 
    cout << typeid(pd).name() << endl; //prints "class Derived *" 
    cout << typeid(*pd).name() << endl; //prints "class Derived" 
    delete pd; 
} 
2

Załóżmy masz:

class A {}; 
class B:A {}; 

A* a = new B(); 
B* b = new B(); 

Dla typu statycznego, spojrzeć na to, jak zmienna jest zadeklarowana.

A* a = ... 
B* b = ... 

Więc statyczny typ a jest A* (lub inaczej mówiąc, statyczny typ *a jest A).

Typ statyczny b to B* (inaczej mówiąc statyczny typ *b to B).

Należy pamiętać, że a i b mają typ statyczny, który jest ustalany przez jego deklarację - nie ma znaczenia, co się w nich umieszcza, zachowa ten sam typ statyczny. ("static" oznacza "niezmienny").


Dla typu dynamicznego patrzysz na to, co dzieje się obecnie w zmiennej.

a = new B(); 
b = new B(); 

Tak dynamiczne typy a i b są zarówno B* (lub inaczej mówiąc, dynamiczne typy *a i *b są zarówno B).

Pamiętaj, że typ dynamiczny może się zmienić - jeśli zrobiłeś a = new A(), to zmieniono typ dynamiczny a na A*. Czasami nie wiesz, co to jest typ dynamiczny - np. jeśli nie a = somefunc() następnie a może mieć dynamiczny typ A*, B* lub nawet C* (jeśli jakiś kod nie widzieliście definiuje C jako podklasa A lub B).

Jeśli metoda A ma na sobie metodę , można użyć dynamic_cast, aby dowiedzieć się, jaki jest typ dynamiczny. (Zwykle, jeśli używasz tego rodzaju kodu, chcesz być w stanie wykonać delete a, aby to zadziałało, destruktor A musi być virtual, a wykonanie destruktora wirtualnego A wystarczy, aby zadziałało dynamic_cast).

Powiązane problemy