Copy-Konstruktor-Probleme



  • Knuddlbaer meint eher das:

    t1 = t;
    

    Nichts mit dem Copy C'tor zu tun hat, sondern mit dem Zuweisungsoperator.



  • Damit du aus einem bestehenden Objekt ein neues Objekt erstellen kannst. Außerdem kann sowas für die Parameterübergabe wichtig sein, wenn du das Objekt by Value übergibst:

    test t(10);
    function(t); // Signatur: void function(test x);
    

    Dies würde den Aufruf des Copy-Konstruktors erzeugen. Der Copy-Konstruktor ist in der gleichen Klasse, weil er aus einem bestehenden Objekt (das als Parameter übergeben wird) ein neues Objekt konstruiert.



  • Muhi89 schrieb:

    dass damit objekte kopiert werden ist schon klar (daher ja der Name) nur was ich n verstehe: Wieso ein bestehendes Objekt kopieren wenn ich ein neues erstellen kann?
    UND: Wieso sind Konstruktor und Copy-K in der selben Klasse?

    Nuja, manchmal braucht man eine Kopie von einem Objekt. Der Copycon erstellt ein neues mit den Werten eines Bestehenden. bei einer flat copy, die vom Compiler autom. erzeugt wird, werden alle Membervariablen bitweise kopiert. Das reicht in vielen Fällen aus. Aber wenn du Zeiger als Member hast, musst du die Inhalte der Zeiger selbst kopieren, da sonst beide Objekte eine Zeiger auf den selben Speicher haben, und das gibt Probleme beim Aufräumen.



  • K sry falls das jmd so verstanden hat:

    Ich meine nicht den standartcopyconbstructor sondern den hier (zB) Studend (Student &s) und ich würd auch gern wissen was es mit dem &s aufsich hat daja s noch gar n existiert.

    Lg



  • Muhi89 schrieb:

    K sry falls das jmd so verstanden hat:

    Ich meine nicht den standartcopyconbstructor sondern den hier (zB) Studend (Student &s) und ich würd auch gern wissen was es mit dem &s aufsich hat daja s noch gar n existiert.

    Lg

    Student (const Student& s );
    Dabei ist s das andere Objekt, von dem kopiert wird. Das neue wird ja erst erstellt, es ist ja ein Konstruktor. & darum, weil sonst nochmal der Copycon aufgerufen würde (Würde der dann nicht rekursiv?),
    und const nicht vergessen.



  • Muhi89 schrieb:

    Ich meine nicht den standartcopyconbstructor sondern den hier (zB) Studend (Student &s) und ich würd auch gern wissen was es mit dem &s aufsich hat daja s noch gar n existiert.

    Das & sagt in diesem Fall aus das s nur eine anderer Name für das an die Funktion übergebene Objekt ist. D.h. es wird nichts kopiert und du ersparst dir eine zusätzliche Kopie eines Objektes.



  • Bei

    Student &s
    

    handelt es sich um eine Referenz (normalerweise ein verpackter Zeiger, der automatisch dereferenziert wird). Im Copy-Konstruktor erwartet man normalerweise ein const-Referenz, wodurch sichergestellt ist das das ursprüngliche Objekt nicht verändert wird.

    Btw: Ich weiß ja nicht welche Bücher du hast, aber vielleicht solltest du mal nach ordentlichen hier im Forum gucken, da wurden schon oft gute Bücher empfohlen.



  • Ok und wofür verwende ich dann die kopierten Objekte?

    Wieso mach ich n gleich neue einer voher bereits bestehenden Klasse?



  • Warum benutzt Du einen Fotokopierer ?



  • Guck mal auf der ersten Seite, da erwähnte ich bereits das man diesen gebrauchen kann, wenn man ein Objekt by Value an eine Funktion übergeben will. Aber wenn du so fragst könnte man auch fragen wozu überhaupt jemals eine Variable kopieren? Sowas macht man doch oftmals auch um einen bestimmten Status zu sichern um diesen im weiteren Programmverlauf verwenden zu können, genau sowas ist auch bei Objekten oft sehr nützlich. Du solltest bzgl. solcher Fragen evtl. etwas Programmiererfahrung sammeln, dann kannst du sie dir selbst beantworten.



  • Testklasse t1( 4, 5 );
    Tesklasse t2( 4, 5 );
    //oder
    Testklasse t2( t1 );
    

    Es gibt genügend Anwendungsfälle, wo Du kopieren willst, ohne die Originaldaten zu kennen.
    Ausserdem muss der Copycon für viele STL Container verfügbar sein. (Stichwort: Assignable )



  • 1310-Logik schrieb:

    (Würde der dann nicht rekursiv?),

    Soweit ich weiß, fangen sowas die Compiler ab. Beispiel:

    class Test {
         public:
                 Test() {}
                 Test(Test tt) {}
    };
    

    Sollte sich nicht compilieren lassen...


Anmelden zum Antworten