static_cast<int>() <-> (int)() Unterschied?
-
Typ umcasten: static_cast
Const entfernen: const_cast (kann nichts außer const entfernen)
dynamic_cast: zur Laufzeit überprüfter downcast
reinterpret_cast: beliebiger Cast erlaubt (für fiese Sachen)Wie man die nutzt, verstehe ich nicht ganz. Einfach so?
static_cast<Zielty>(ZuKonvertieren)
const_cast<Zielty>(ZuKonvertieren)
dynamic_cast<Zielty>(ZuKonvertieren)
reinterpret_cast<Zielty>(ZuKonvertieren)Was ist ein "downcast"?
Und was ist mit "reinterpret_cast [...] für fiese Sachen" gemeint?
Was kann man denn mit den anderen casts nicht machen, was der kann?
-
reinterpret_cast sorgt dafür, dass der Compiler einfach das Typensystem ignoriert (bis auf const).
Ein Down Cast ist wenn du in einer Klassen Hierachie von einer Basis Klasse auf eine abgeleitete Klasse castest. Wenn dir das nichts sagt, dann musst du es auch noch nicht wissen und erst virtuelle-Vererbung lernen
btw. am besten auch die
FAQ
lesen!
-
kingruedi schrieb:
reinterpret_cast sorgt dafür, dass der Compiler einfach das Typensystem ignoriert (bis auf const).
und wo ist da der Unterschied zu static_cast?
-
int i = 123; double* p; p = (double*)i; // OK aber nicht unbedingt sinnvoll p = static_cast<double*>(i); // Fehler! Typen sind inkompatibel/nicht verwandt p = reinterpret_cast<double*>(i); // OK, ich meine es ernst!
Jester schrieb:
const_cast (kann nichts außer const entfernen)
doch: const hinzufügen
/Edit: und volatile hinzufügen/entfernen natürlich
-
tag schrieb:
int i = 123; double* p; p = (double*)i; // OK aber nicht unbedingt sinnvoll p = static_cast<double*>(i); // Fehler! Typen sind inkompatibel/nicht verwandt p = reinterpret_cast<double*>(i); // OK, ich meine es ernst!
ah, danke. Habe diesen Umstand nie bemerkt, weil ich eh immer Variante 1 nehme.
-
double pi = 3.14; int pi = (int) pi; // C int pi = int( pi ); // C++ int pi = static_cast<int>( pi ); // C++ edel!
-
Noch eine Frage: Wie kann ich aus einem Array von unsigned long Werten, welche binär in eine Datei speichern?
So scheint es zu gehen:PrimDatei.write((const char*)(&Primzahlen[0]),Platzbedarf);
aber so nicht:
PrimDatei.write(static_cast<const char*>(&Primzahlen[0]),Platzbedarf);
Ich würde es aber gerne auf die "Edle" Art machen. Wie müsste es dann aussehen? Und gehen dabei nicht informationen verloren, wenn ich unsigned long zu char mache? Ich hab das erste aus einem Buch, aber leider war es da nicht gleich ein Array. Und noch was: greift man so überhaupt auf die Addresse eines Arrayeintrags zu?
-
Mittlerweile hab ich etwas darübner nachgedacht: Man kann ohne Probleme von "unsigned long int" nach "char" casten, weil ja die Addresse UND die Länge des Datentyps übergeben werden. Damit muss "Dateiname.write()" nur den Zeiger entsprechen erhöhen, um auch die anderen Byte zu bekommen. Ebenso ist mir mittlerweile klar, dass meine Frage zu unklar formuliert war:
Welchen dieser Casts muss ich nehmen, um von "unsigned long int*" nach "const char*" zu casten?
1.) static_cast<>()
2.) const_cast<>()
3.) dynamic_cast<>()
4.) reinterpret_cast<>()und dann noch was: Was zeichnet dynamic_cast<>() aus?
-
einmal zahl nach string und zurück
http://www.c-plusplus.net/forum/viewtopic.php?t=39488&sid=023109ad0f74a90ca9fa8ce1e3378d7d
und im faq steht auch was zu der anderen frage.
-
elise: Nein, er möchte die Zahlen binär speichern, nicht zu Strings umwandeln.
Nimda: reinterpret_cast wandelt nicht miteinander verwandte Zeiger ineinander um.
dynamic_cast wird z.B. zum Downcast benutzt, d.h. wenn du einen Basisklassenzeiger auf ein Objekt einer abgeleiteten Klasse hast, und diesen in einen Zeiger auf die abgeleitete Klasse umwandeln willst. Soweit kann das auch static_cast, aber dynamic_cast prüft zusätzlich zur Laufzeit, ob die Umwandlung überhaupt zulässig ist. Wenn du z.B. einen Tier-Pointer auf einen Hund hast, und ihn versuchst in einen Katze-Pointer zu konvertieren, gibt dynamic_cast einen Nullpointer zurück.
-
DANKE!!!
Probier ich gleich mal...
-
Bashar schrieb:
elise: Nein, er möchte die Zahlen binär speichern, nicht zu Strings umwandeln.
.ja, habe die erste seite heute morgen irgendwie übersehen und war auf der falschen fährte.
<ot>ich weiß auch warum.. wenn man im momment auf die seite direkt klickt, also dann zu dem aktuellen beitrag geht, werden die seiten davor nicht angezeigt, sprich: man weiß nicht, daß da welche davor existieren..</ot>