Konstruktor kann nur 1x aufgerufen werden, oder?
-
Ein Cast der eine Umwandlung erfordert kann auch ein temporäres Objekt erzeugen, wenn erforderlich. An die privaten Daten eines Objekts kommst Du ja nicht ran, deshalb schreibt er den Wert auch nicht einfach in das erste (erstbeste) Datenfeld. Die beiden Ausdrücke sind äquivalent.
Anders ist es wenn eine Konvertierung verfügbar ist, aber dann wird es der Compiler ziemlich wahrscheinlich weg optimieren.
// Nicht zwingend äquivalent: int x = (int)3.25; // explizite double nach int Konvertierung int x = int(x); // implizite double nach int Konvertierung und Erzeugung eines temporären int, darf aber wegoptimiert werden wodurch es wieder zu obiger Form äquivalent wird
-
akari schrieb:
nein das ist nicht äquivalent.
Das erste ist ein C-style Cast, das zweite ein Konstruktor-Aufruf.Was passiert denn bei einem C-Style Cast für den keine implizite Umwandlung bereitsteht, wenn nicht eine temporary Konstruktion?
-
Danke... ich werde versuchen es zu verstehen.
Ist nicht ganz einfach, C++ bietet ja sehr viele Möglichkeiten
-
Hallo
der Cast läßt einfach auf den Speicherbereich, der hinter der Variablen a vom Typ A liegt, als Typ B zugreifen.
Beispiel :int a = 0; float* b = (float*)(&a);wird kompilieren, aber verursacht beim Verwenden von *b undefinierte Fehler.
bis bald
akari
-
Aber wie kann ein int-Typ in einen Klassen-Typ gewandelt werden?
Das verstehe ich nicht... Was wird wohin kopiert..
-
Hallo
was für ein int-Wert wird in was für eine Klasse verwandelt? Wenn du dein Euro() besipiel meinst, das ist ein double-Wert.
Die Klasse hat ein Konstruktor, der als Parameter ein double zuläßt. Das können auch ganz andere, von der eigentlichen Klasse unabhängige Typen sein. Ein Konstruktor ist was die Parameter angeht wir eine normale Funktion.bis bald
akari
-
Ich meinte das:
(Euro)1.49Das ist doch kein Konstruktor-Aufruf...
-
Das meinte ich auch als Frage an akari

Das mit dem Zeigerbeispiel war mir wohl klar, trifft hier aber ziemlich sicher nicht zu. Was stattdessen, da lasse ich mich gerne belehren, aber ein (Euro)2.56 versucht ziemlich sicher nicht eine Speicherzelle an der sich ein double befindet als Euro-Objekt zu interpretieren.
Einfachstes Beispiel:
string a = (string) "Hallo, Welt";Wenn der Cast hier das Literal als Verwaltungsdaten für die Klasse string interpretieren würde, wäre das wohl ziemlich tödlich

-
Hallo
in beiden Fälle nwird tatsächlich der Konstruktor der jeweiligen Adresse aufgerufen. Das kann aber nur passieren ,wenn ein Konstruktor für genau diesen Parameter definiert ist.
Dann wir also ein tempöräres Objekt erstellt und per Zuwesiungoperator an den L-Value übergeben.bis bald
akari
-
Frinz bedankt sich.