Unterschied Zuweisung -Initialisierung



  • Hallo,

    ich tue mich schwer mit dem Unterschied zwischen einer Initialisierung und einer Zuweisung.

    float pi = 3.14 ist eine Initialisierung

    und

    int i; i = 42 eine Zuweisung

    aber was ist der Unterschied?
    Nur der Zwischenweg über das Semikolon?

    Danke
    Lou



  • Schauen wir erstmal auf Klassen (benutzerdefinierte Typen im Prinzip), dann ist es einfacher:
    MyFloat pi = 3.14f;
    Hier wird nur ein Konstruktor aufgerufen. MyFloat wird erstellt mit einem gültigen Wert.

    MyFloat pi;
    pi = 3.14f;
    

    Hier wird ein Konstruktor aufgerufen, der vermutlich erstmal mit einem standardwert initialisiert (0) und danach in Zeile 2 wird dann der Zuweisungsoperator aufgerufen. Das ist mehr Arbeit!

    Die Initialisierung wird bei "build in types" (int, float, ...) nicht automatisch durchgeführt.
    Das heißt der darin enthaltene Wert ist undefiniert (nicht 0, einfach irgendwas!) bis man etwas zuweist. Falls man sie versehentlich vorher benutzt hat man den Salat.

    Deshalb sollte man sich immer überlegen ob man die Variable die man gerade deklariert nicht sinnvoll initialisieren kann. Benutzt man auto geht das auch gar nicht anders (google C++ auto, falls unbekannt).



  • @Lou-Cyphr3 sagte in Unterschied Zuweisung -Initialisierung:

    Nur der Zwischenweg über das Semikolon?

    Statt des Semikolons kann da noch eine Menge Code stehen.

    Damals durfte man Variablen nur am Anfang einer Funktion definieren, daher war eine Initialisierung nicht immer nötig.

    Und was der Compiler daraus macht, muss man dann auch erstmal sehen.



  • Also wenn ich es richtig verstanden habe, geht es eigentlich bei einer Initialisierung nur um die "direkte Zuweisung" und bei der Zuweisung
    um eine spätere Initalisierung?
    Aber warum kann man diese Variable nicht einfach rückwirkend nochmal umschreiben wenn man den Wert dann kennt?



  • Klar kannst du. Solange du die Variable nicht versehentlich unintialisiert ausliest und benutzt ist es egal. Wenn die erste Zuweisung nicht ein paar Zeilen später passiert, solltest du die Variable aber lieber initialisieren. (Zwecks Fehlervermeidung)



  • Okay. Vielen Dank.



  • @Lou-Cyphr3 sagte in Unterschied Zuweisung -Initialisierung:

    Aber warum kann man diese Variable nicht einfach rückwirkend nochmal umschreiben wenn man den Wert dann kennt?

    Naja, eine "Zuweisung" ist doch eine "Umschreibung". Was meinst du aber mit "rückwirkend"? Rückwirkend geht gar nichts. Nur: wenn du jetzt an irgendeine Klasse denkst, dann ist operator= und der Konstruktor eben eine andere Funktion. Logisch gesehen sollten sie das Objekt in denselben Status überführen, aber der Weg darf durchaus anders sein. Eine spätere Initialisierung ist aber auch dann noch möglich und nennt sich "placement new" (s.u.). Allerdings ist das doch irgendwie komisch, wenn du erst ein Objekt erzeugst und es später dann nochmal erzeugst. Bei den einfachen eingebauten Zahl-Typen wie "float" macht das nichts aus, aber sinnvoll ist die Trennung trotzdem nicht.

    float f = 17.f;  // initialisierung
    new (&f) float(42.f); // erneute initialisierung (in der Regel NICHT empfehlenswert)
    

Anmelden zum Antworten