Chcę wiedzieć, co to jest sprawdzanie typu statycznego i dynamicznego oraz różnice między nimi.Sprawdzanie typu statycznego i dynamicznego w C++
Odpowiedz
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.
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ę). –
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.
dynamic_cast istnieje w C++ i wykonuje sprawdzanie typu czasu działania w wielu środowiskach wykonawczych C++. –
Stoję poprawiony :) Dzięki! –
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
"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
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. –
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;
}
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
).
- 1. Tworzenie dynamicznego typu w C++
- 2. Sprawdzanie typu pochodnego (C++)
- 3. Dostęp do statycznego atrybutu statycznego typu ogólnego
- 4. Wartość domyślna typu dynamicznego?
- 5. C++: W jaki sposób można utworzyć szablon dynamicznego typu?
- 6. Nowe, nowoczesne sprawdzanie typu enum Objective-C
- 7. Sprawdzanie typ obiektu w C++ 11
- 8. Użyj typu statycznego zamiast zmiennej
- 9. Ignorowanie typu dynamicznego w systemie iOS: Dostępność
- 10. Co to oznacza dla statycznego linkowania i dynamicznego linkowania w Pythonie?
- 11. Porównywanie klas pochodnych w C++ bez rzutowania dynamicznego lub statycznego downcastingu
- 12. Czy istnieje odpowiednik statycznego C w C#?
- 13. Przeciążanie statycznego operatora C++
- 14. Sprawdzanie typu zmiennej
- 15. C# AcceptButton i sprawdzanie poprawności
- 16. W jaki sposób użytkownik automatyczny może określić kombinację łączenia statycznego i dynamicznego?
- 17. Sprawdzanie niedopełnienia/przepełnienia w C++?
- 18. Przesyłanie do ogólnej listy zmiennych typu dynamicznego
- 19. Sprawdzanie czasu statycznego/kompilacji dla javascript z jquery?
- 20. Jak wykonać sprawdzanie typu runtime w Dart?
- 21. Wzór dla dynamicznego obiektu C#
- 22. jaki jest ekwiwalent C# statycznego {...} w Javie?
- 23. Określanie systemu operacyjnego i typu procesora w języku C#
- 24. Wyłącz rygorystyczne sprawdzanie typu MIME w Chrome
- 25. Typ dynamicznego zwrotu Java?
- 26. Jak zaimplementować/użyć typu dynamicznego w materialnym projekcie systemu Android?
- 27. Sprawdzanie varargs typu przypisania makra Scala
- 28. Sprawdzanie sfinae dla statycznego elementu przy użyciu dekltype
- 29. Sprawdzanie pustego pliku w C++
- 30. C++ - Sprawdzanie 3 z rzędu
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
Celem stackoverflow jest stać się repozytorium całej wiedzy programistycznej, nawet jeśli istnieje gdzie indziej. –
Znam go gdzieś w google, ale tutaj masz wiele definicji, które pomagają ci zrozumieć w bardziej przejrzysty sposób – rkb