User Tools

Site Tools


cpp:casting

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
cpp:casting [2026/04/24 12:20] – [const_cast<>] gthanoscpp:casting [2026/04/24 12:28] (current) – [reinterpret_cast<>] gthanos
Line 190: Line 190:
 </WRAP> </WRAP>
  
-Συνοπτικός Πίνακας+**Συνοπτικός Πίνακας**
  
 ^  Τύπος  ^  static_cast  ^  dynamic_cast  ^ ^  Τύπος  ^  static_cast  ^  dynamic_cast  ^
Line 205: Line 205:
   * **Γιατί να το κάνεις:** Συνήθως χρησιμοποιείται όταν έχεις να κάνεις με παλιές βιβλιοθήκες (Legacy C code) που δέχονται char* ενώ ξέρεις ότι δεν πρόκειται να τροποποιήσουν το περιεχόμενο, αλλά εσύ έχεις ένα const char*.   * **Γιατί να το κάνεις:** Συνήθως χρησιμοποιείται όταν έχεις να κάνεις με παλιές βιβλιοθήκες (Legacy C code) που δέχονται char* ενώ ξέρεις ότι δεν πρόκειται να τροποποιήσουν το περιεχόμενο, αλλά εσύ έχεις ένα const char*.
   * **Ο Κίνδυνος:** Αν αφαιρέσεις το const από μια μεταβλητή που ορίστηκε εξ αρχής ως const και προσπαθήσεις να την αλλάξεις, το αποτέλεσμα είναι Undefined Behavior (μπορεί να "σκάσει" το πρόγραμμα ή να μην αλλάξει η τιμή ποτέ).   * **Ο Κίνδυνος:** Αν αφαιρέσεις το const από μια μεταβλητή που ορίστηκε εξ αρχής ως const και προσπαθήσεις να την αλλάξεις, το αποτέλεσμα είναι Undefined Behavior (μπορεί να "σκάσει" το πρόγραμμα ή να μην αλλάξει η τιμή ποτέ).
 +
 +<code cpp cost_cast.cpp>
 +void legacy_function(char* str) { 
 +   /* ... */ 
 +}
 +
 +const char* my_text = "Hello";
 +// legacy_function(my_text); // ΣΦΑΛΜΑ
 +legacy_function(const_cast<char*>(my_text)); // Επιτρέπεται
 +</code>
  
 ====== reinterpret_cast<> ====== ====== reinterpret_cast<> ======
 +
 +Αυτός είναι ο πιο ισχυρός και επικίνδυνος τελεστής. Λέει στον compiler: "Κάνε αυτή τη μετατροπή, ακόμα και αν δεν βγάζει νόημα".
 +
 +**Τι κάνει:** Μετατρέπει οποιονδήποτε δείκτη σε οποιονδήποτε άλλον τύπο δείκτη, ή ακόμα και δείκτη σε ακέραιο και το αντίστροφο.
 +
 +**Προσοχή:** Δεν ελέγχει τίποτα. Αν μετατρέψεις έναν int* σε Dog* και καλέσεις μια μέθοδο, ο compiler θα το κάνει και απλώς θα προσπαθήσει να διαβάσει το περιεχόμενο του int** σαν να ήταν αντικείμενο της κλάσης Dog.
 +
 +<code cpp reinterpret_cast.cpp>
 +long address = 0x7FFF1234;
 +// Ερμήνευσε αυτόν τον αριθμό ως διεύθυνση μνήμης ενός ακεραίου
 +int* p = reinterpret_cast<int*>(address);
 +</code>
 +
 +Ο συγκεκριμένος τελεστής μοιάζει με το type casting που γνωρίζουμε από τη γλώσσα C, διότι ο μεταγλωττιστής ακολουθεί χωρίς έλεγχο τις οδηγίες του προγραμματιστή.
 +
 +
cpp/casting.1777033229.txt.gz · Last modified: 2026/04/24 12:20 by gthanos