Kopien von einem Objekt



  • Hey!

    Wenn ich folgenden Code habe:

    call_by cb1(111);
    
    	call_by cb2 = cb1;
    
    	cout << "cb2.i: " << cb2.i << endl;
    
    	cb1.i = 222;
    
    	cout << "cb2.i: " << cb2.i << endl;
    

    Dann kopiere ich cb1 in cb2 in der 2. Zeile, oder?

    Zum Referenzieren müsste ich ja

    call_by *cb2 = &cb1;
    

    bzw.

    call_by &cb2 = cb1;
    

    schreiben.

    Stimmt das mit der Kopie?

    In java wäre nämlich die Variante ganz oben eine Referenzierung.

    Danke!



  • blub85 schrieb:

    Hey!

    Wenn ich folgenden Code habe:

    call_by cb1(111);
    	
    	call_by cb2 = cb1;
    

    Dann kopiere ich cb1 in cb2 in der 2. Zeile, oder?

    Stimmt das mit der Kopie?

    Ja.



  • Okay, das ist schomma gut, dass ich das richtig verstanden hab. 🙂

    Jetzt noch ne Frage:

    Wenn ich mein Objekt mit

    Foo f = new Foo();
    

    erstelle, kann ich genauso arbeiten, wie mit

    Foo f;
    

    oder? Nur die Speicherweise ist eine andere.



  • Kurze Antwort: Nein! (vermeide new wenn es nicht nötig ist).
    Die Frage gab es hier gerade, Stichwort Zeiger.



  • Da ich mich aber eher theoretisch mit C++ ausainander setzen muss (Diplomprüfung Info) wär es mal interessan tzu wissen, wo die Unterschiede sind.

    Danke


  • Mod

    blub85 schrieb:

    Da ich mich aber eher theoretisch mit C++ ausainander setzen muss (Diplomprüfung Info) wär es mal interessan tzu wissen, wo die Unterschiede sind.

    Die theoretische Antwort ist, dass ein Objekt

    Foo foo;  // foo ist ein Objekt vom Typ Foo
    

    im automatischen Speicher (in der Praxis oft durch einen, bzw. den Stack implementiert) erzeugt wird. Früher (mittlerweile ganz schlimm veraltet!) konnte man schreiben

    auto Foo foo;
    

    , um damit die Speicherklasse noch deutlicher zu machen (was natürlich niemand so geschrieben hat, da das auto implizit war). Objekte dieser Art behandelst du genau so wie du es hoffentlich gewohnt bist.

    Mit new erzeugst du Objekte im Freispeicher (free-store, in der Praxis ein/der Heap). Diese Objekte kannst du nicht direkt mit ihren Namen ansprechen, sie haben schließlich keinen, stattdessen wirst du dir irgendwo einen Zeiger merken. Eine einfache (aber fehleranziehende) Schreibweise wäre:

    Foo *foo = new Foo; // foo ist vom Typ Zeiger auf Foo. foo zeigt auf ein Foo auf dem Heap
    

    Bei Zeigern hast du immer eine Indirektion dabei. Wenn du zwei Zeiger einander zuweist, dann weist du den Wert des Zeigers zu, das dahinterliegende Objekt bekommt davon gar nichts mit, insbesondere wird es nicht kopiert. Wenn du auf das Objekt dahinter zugreifen möchtest, dann musst du den Zeiger vorher dereferenzieren mit den Operatoren * , -> (kurz für (*foo). ) oder [] (kurz für *(foo + index) ) (oder den selten gebrauchten Operatoren .* und ->* , die ich jetzt nicht erkläre). Das ganze ist dem Verhalten in Java ähnlich, welches im Hintergrund auf diese Weise funktioniert, aber die Details (z.B. Dereferenzierung) vor dem Programmierer versteckt. Bei Objekten im Freispeicher geht außerdem die Verantwortung auf den Programmierer über, diese später mit delete abzuräumen. Bei Objekten im automatischen Speicher erfolgt dies automatisch nach genau festgelegten Regeln, daher auch der Name.



  • RAII ist auch ganz interessant. 😃
    Für deine Dimplom-prüfung jedenfalls ^^



  • SeppJ, suuuuuuuuuuper!! Vielen Dank für die Mühen!!

    Hast mir sehr geholfen!!


Anmelden zum Antworten