Funktionsweise Default Kopierkonstruktor - Referenz?!



  • hey leute,
    ich bin grad neu am c++ lernen und ich dachte ich hätte den Default Kopierkonstruktor verstanden, aber mein Programm verwirrt mich grad bissle...

    Mein Code:

    class Point {
    	int x, y;
    public:
    	Point(int x, int y) : x(x), y(y) {} 
    
    	void print() { std::cout << "x= " << x << " y= " << y << std::endl; }
    
    	void setX(int set) { x = set; }
    };
    
    int main()
    {    
    	Point p1(45, 12);
    	Point p2 = p1;
    	p1.print(); //Output: 45 , 12
    	p2.print(); //Output: 45 , 12
    
    	p2.setX(111);
    	p1.print(); // Output:  45 , 12
    	p2.print(); // Output: 111 , 12
    
    	return 0;
    }
    

    Also ich habs so verstanden...
    wenn man ein Objekt einem anderem Objekt zuweist (Point p2 = p1) , dann wird der Default Kopierkonstruktor aufgerufen und erzeugt eine REFERENZ auf die Werte von Point p1.(Wird ja glaub auch dann flache Kopie genannt...)
    Richtig?

    Und unter Referenz versteh ich sowas...

    //dies gehört nicht zu meinem Programm, ist nur fürs verständnis
    int  a = 1;  
    int &r = a;
    

    also wenn ich hier jetzt "r" zum Beispiel "5" zuweise, dann wird der Wert von "a" auch "5".
    Richtig?

    Jetzt kommt mein Problem...
    Ich ändere den X Wert von p2 mit setX auf 111, wieso ändert sich dann nicht auch der X Wert von p1???
    Dachte p2 wäre eine Referenz von p1!

    Wo denk ich falsch?? 😕

    schon mal danke 👍 🙂


  • Global Moderator

    Der Kopierkonstruktor heißt nicht umsonst "Kopierkonstruktor" und nicht etwa "Referenzkonstruktor".



  • SeppJ schrieb:

    Der Kopierkonstruktor heißt nicht umsonst "Kopierkonstruktor" und nicht etwa "Referenzkonstruktor".

    Vielen Dank für deine seeeeeeeehr hilfreiche Antwort!

    👎👎👎👎 SeppJ 👎👎👎👎



  • int &r = a;
    

    vs.

    Point p2 = p1;
    

    schau dir nochmal an was fehlen könnte und vor allem was es bedeutet 😉



  • Patrick123456 schrieb:

    SeppJ schrieb:

    Der Kopierkonstruktor heißt nicht umsonst "Kopierkonstruktor" und nicht etwa "Referenzkonstruktor".

    Vielen Dank für deine seeeeeeeehr hilfreiche Antwort!

    👎👎👎👎 SeppJ 👎👎👎👎

    Du wirst es noch weit bringen...



  • Patrick123456 schrieb:

    Also ich habs so verstanden...
    wenn man ein Objekt einem anderem Objekt zuweist (Point p2 = p1) , dann wird der Default Kopierkonstruktor aufgerufen und erzeugt eine REFERENZ auf die Werte von Point p1.(Wird ja glaub auch dann flache Kopie genannt...)
    Richtig?

    Nein. So sieht der Kopierkonstruktor aus:

    class Point { 
    Point (const Point & other); 
    };
    

    Man übergibt ihm eine Referenz auf einen anderen Point, aber er speichert sie nicht und erzeugt auch keine, sondern benutzt sie, um das übergebene Objekt elementweise zu kopieren. Es entsteht also eine neue unabhängige Instanz von Point mit eigenen Membervariablen x und y.

    "Flache Kopie" heißt das deshalb, weil wenn ein Point Zeiger auf andere Objekte enthalten würde, nur die Zeiger kopiert würden und nicht die Objekte. Je nach Anwendungsfall kann das erwünscht sein oder auch später zu Problemen führen.

    Das Gegenstück, das die Objekte mitkopiert, heißt "tiefe Kopie", und wenn man das will, muss man den Kopierkonstruktor selber implementieren.



  • Patrick123456 schrieb:

    Vielen Dank für deine seeeeeeeehr hilfreiche Antwort!

    👎👎👎👎 SeppJ 👎👎👎👎

    manni66 schrieb:

    Du wirst es noch weit bringen...

    Jepp. Warum kann man nicht einfach mal schweigen, wenn man was von jemanden will?



  • Patrick123456 schrieb:

    Also ich habs so verstanden...
    wenn man ein Objekt einem anderem Objekt zuweist (Point p2 = p1) , dann wird der Default Kopierkonstruktor aufgerufen und erzeugt eine REFERENZ auf die Werte von Point p1.

    Dann hast du es falsch verstanden.
    Der Kopierkonstruktor kopiert die Werte. Initial sind die dann gleich. Wenn du eine Kopie dann änderst, änder sich die andere aber natürlich nicht mit. Dann sind die Werte eben unterschiedlich.

    Ist auch einfach zu verstehen dass das so sein muss, da sich der Typ der Membervariablen in einem Point Objekt ja nicht ändert - da sind immer zwei int drinnen d.h. es können nie Referenzen werden.

    Patrick123456 schrieb:

    (Wird ja glaub auch dann flache Kopie genannt...)

    Shallow copy vs. deep copy macht nur einen Sinn wenn du Referenzen bzw. Zeiger hast. Wenn du in einem Objekt z.B. einen Zeiger auf einen int hättest, dann würde vom Kopierkonstruktor auch nur der Zeiger kopiert. DAS wäre dann eine shallow copy.

    Richtig?

    Patrick123456 schrieb:

    SeppJ schrieb:

    Der Kopierkonstruktor heißt nicht umsonst "Kopierkonstruktor" und nicht etwa "Referenzkonstruktor".

    Vielen Dank für deine seeeeeeeehr hilfreiche Antwort!

    👎👎👎👎 SeppJ 👎👎👎👎

    SeppJ ist mMn. einer der hilfreichsten Benutzer dieses Forums. Seine Antwort hätte vermutlich auch reichen sollen. Dass du sie nicht verstanden hast ist OK, aber es bringt dir mehr wenn du einfach nur darauf hinweist dass du es nicht verstanden hast anstatt zynisch zu werden. Damit machst du dir mehr Freunde - die dann auch eher gewillt sind dir auch in Zukunft zu helfen.