Objektverweise - Was passiert hier



  • Hey Leute,

    ich hab eine kurze Frage zu folgendem Programm

    class A {
    
    public:
    	int a;
    	A(int x) : a(x) {}
    
    };
    
    int main()
    {
    	A w(0);
    	printf("%p\n",&w);
    
    	w = A(1);
    	printf("%p\n",&w);
    
    	return 0;
    }
    

    Was genau passiert hier?
    Ich bekomme bei beiden Print-Anweisungen die selbe Adresse ausgegeben, von daher denke ich, dass die Inhalte der Attribute des temporären Objekts "A(1)" einfach nur in die des Objekts w geschrieben werden und w nach der Anweisung "w = A(1);" auf gar kein neues Objekt zeigt, ist das so richtig?

    Gruß 🙂



  • MatheStein schrieb:

    class A {
    
    public:
    	int a;               //Membervariable(die in deinem Programm keinen Nutzen hat)
    	A(int x) : a(x) {}   //Konstruktor mit Initialisierung
    
    };
    
    int main()
    {
    	A w(0);               //Du initialisierst a mit 0
    	printf("%p\n",&w);    //du gibst die Adresse von w aus
    
    	w = A(1);             //du kopierst A in w
    	printf("%p\n",&w);    //wieder die Adresse ausgeben
    	
    
    	return 0;
    }
    

    Gruß 🙂

    Ist das aus einem Buch?
    [EDIT]:besser wäre, wenn du std::cout nehmen würdest als printf!



  • C++ ist nicht Java!
    Bei Deiner Zuweisung in Zeile 17 wird wird ein temporäres A-Objekt erstellt und in w hinein kopiert. Also ja, Deine Annahme ist richtig.



  • MatheStein schrieb:

    Was genau passiert hier?

    Ich bekomme bei beiden Print-Anweisungen die selbe Adresse ausgegeben, von daher denke ich, dass die Inhalte der Attribute des temporären Objekts "A(1)" einfach nur in die des Objekts w geschrieben werden und w nach der Anweisung "w = A(1);" auf gar kein neues Objekt zeigt, ist das so richtig?

    w ist ja auch kein Zeiger. w bezeichnet das Objekt direkt. C++ zwingt Dir keine Indirektion bei Klassentypen auf, wie es andere Sprachen machen. Das ist im Prinzip genauso wie bei int und double auch. Deswegen brauchen wir auch viel viel seltener den new Operator. Wir müssen Objekte nicht dynamisch anlegen und uns einen Zeiger darauf merken. Bei der Zuweisung wird der Zuweisungsoperator verwendet, den sich der Compiler selbst aus den Rippen schneidet, weil Du ihn nicht selbst deklariert hast in der Klasse. Das ist auch nicht weiter schlimm; denn dieser Zuweisungsoperator weist einfach allen Datenelementen des Zielobjekts die Werte der Datenelemente des Quellobjekts zu. Die Zuweisung bezieht sich immer auf ein bestehendes Objekt. Ein neues Objekt als Kopie erzeugen kann man auch:

    A x = w;
    

    Das sieht auch wie eine Zuweisung aus, ist es aber nicht. Hier wird der Kopierkonstruktor der Klasse gefordert. Der wird, weil Du ihn auch nicht deklariert hast, auch vom Compiler erzeugt und rate mal, was der macht ...

    Verweise sind hier nirgens!


Anmelden zum Antworten