cpp:casting
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| cpp:casting [2026/04/24 12:06] – [dynamic_cast<>] gthanos | cpp:casting [2026/04/24 12:28] (current) – [reinterpret_cast<>] gthanos | ||
|---|---|---|---|
| Line 106: | Line 106: | ||
| Derived derived(100); | Derived derived(100); | ||
| Base& b = static_cast< | Base& b = static_cast< | ||
| - | </ | + | </ |
| + | |||
| + | Το **static_cast** εφαρμόζεται σχεδόν στα πάντα: | ||
| + | |||
| + | * **Κανονικούς Τύπους: | ||
| + | * **Pointers: | ||
| + | * **References**: | ||
| + | * **Enums:** Μετατροπή enums σε integers και αντίστροφα. | ||
| + | |||
| + | **Σημαντικό: | ||
| </ | </ | ||
| - | ====== dynamic_cast<> | + | ===== dynamic_cast<> |
| Το **dynamic_cast** είναι ο τύπος casting που εφαρμόζεται στον πολυμορφισμό. Το χρησιμοποιούμε όταν έχουμε έναν δείκτη προς μια βασική κλάση (Base*) και εξετάζουμε αν το αντικείμενο στο οποίο δείχνει είναι μια συγκεκριμένη παράγωγη κλάση (Derived*). | Το **dynamic_cast** είναι ο τύπος casting που εφαρμόζεται στον πολυμορφισμό. Το χρησιμοποιούμε όταν έχουμε έναν δείκτη προς μια βασική κλάση (Base*) και εξετάζουμε αν το αντικείμενο στο οποίο δείχνει είναι μια συγκεκριμένη παράγωγη κλάση (Derived*). | ||
| Line 172: | Line 181: | ||
| </ | </ | ||
| - | ==== Παρατηρήσεις ==== | + | <WRAP tip 80% center round> |
| - | * **Runtime Check: | + | * **Runtime Check: |
| - | * **Ασφάλεια (Safety):** Αν χρησιμοποιούσαμε **static_cast** και το αντικείμενο ήταν CheckingAccount, | + | * **Ασφάλεια (Safety):** Αν χρησιμοποιούσαμε **static_cast** και το αντικείμενο ήταν |
| + | * **Πολυμορφισμός: | ||
| + | * **Δε λειτουργεί για κανονικούς τύπους: | ||
| - | * **Πολυμορφισμός: | + | </ |
| + | **Συνοπτικός Πίνακας** | ||
| + | ^ Τύπος | ||
| + | ^ Βασικοί Τύποι (int, double, κλπ) | ||
| + | ^ Pointers (Base* -> Derived*) | ||
| + | ^ References (Base& -> Derived& | ||
| + | ^ Enums | Ναι | ||
| - | ====== const_cast<> | + | ===== const_cast<> |
| + | |||
| + | Είναι ο μόνος τελεστής που μπορεί να προσθέσει ή να αφαιρέσει το const (ή το volatile) από μια μεταβλητή. | ||
| + | |||
| + | * **Γιατί να το κάνεις: | ||
| + | * **Ο Κίνδυνος: | ||
| + | |||
| + | <code cpp cost_cast.cpp> | ||
| + | void legacy_function(char* str) { | ||
| + | /* ... */ | ||
| + | } | ||
| + | |||
| + | const char* my_text | ||
| + | // legacy_function(my_text); | ||
| + | legacy_function(const_cast< | ||
| + | </ | ||
| ====== reinterpret_cast<> | ====== reinterpret_cast<> | ||
| + | |||
| + | Αυτός είναι ο πιο ισχυρός και επικίνδυνος τελεστής. Λέει στον compiler: " | ||
| + | |||
| + | **Τι κάνει: | ||
| + | |||
| + | **Προσοχή: | ||
| + | |||
| + | <code cpp reinterpret_cast.cpp> | ||
| + | long address = 0x7FFF1234; | ||
| + | // Ερμήνευσε αυτόν τον αριθμό ως διεύθυνση μνήμης ενός ακεραίου | ||
| + | int* p = reinterpret_cast< | ||
| + | </ | ||
| + | |||
| + | Ο συγκεκριμένος τελεστής μοιάζει με το type casting που γνωρίζουμε από τη γλώσσα C, διότι ο μεταγλωττιστής ακολουθεί χωρίς έλεγχο τις οδηγίες του προγραμματιστή. | ||
| + | |||
| + | |||
cpp/casting.1777032387.txt.gz · Last modified: 2026/04/24 12:06 by gthanos
