In einem Kopierkonstruktur etwas anderes tun als kopieren
-
Hallo,
folgendes Beispiel:
#include <iostream> using namespace std; class Demo { public: Demo() { ch = 'D'; } ; Demo(const Demo& dr) { ch = 'X'; } char ch; }; int main() { Demo d1; Demo d2 = d1; cout << d1.ch << endl; cout << d2.ch << endl; return 0; }Warum ist es gefährlich in einem Kopierkonstruktor etwas anderes zu tun als zu kopieren? Gibt es dafür ein Beispiel?
Danke!
-
Finde ich gut so!
-
Es widerspricht nunmal der Intuition. Etwas "Gefährliches" (was ist überhaupt gefährlich beim Hobby-Programmieren am PC?) fällt mir nicht ein.
-
gregg schrieb:
Warum ist es gefährlich in einem Kopierkonstruktor etwas anderes zu tun als zu kopieren? Gibt es dafür ein Beispiel?
Weil der Kopierkonstruktor vom Compiler an vielen Stellen automatisch aufgerufen wird, wenn eben etwas kopiert werden soll.
Und es gibt sogar extra Stellen im Standard die es dem Compiler *erlauben* den Aufruf des Kopierkonstruktor in bestimmten Situationen wegzulassen.
D.h. er kann den Kopierkonstruktor aufrufen, muss aber nicht.Suchbegriffe: "RVO", "NRVO" und "copy elision".
Und wenn das Verhalten deines Programms sich durch etwas ändert, was der Compiler eben so oder so machen darf, dann ist es offensichtlich ein schlechtes Programm.
Und deswegen macht man das nicht.
Und natürlich weil es total kontraintuitiv ist.
-
hustbaer schrieb:
gregg schrieb:
Warum ist es gefährlich in einem Kopierkonstruktor etwas anderes zu tun als zu kopieren? Gibt es dafür ein Beispiel?
Weil der Kopierkonstruktor vom Compiler an vielen Stellen automatisch aufgerufen wird, wenn eben etwas kopiert werden soll.
Und es gibt sogar extra Stellen im Standard die es dem Compiler *erlauben* den Aufruf des Kopierkonstruktor in bestimmten Situationen wegzulassen.
D.h. er kann den Kopierkonstruktor aufrufen, muss aber nicht.Suchbegriffe: "RVO", "NRVO" und "copy elision".
Und wenn das Verhalten deines Programms sich durch etwas ändert, was der Compiler eben so oder so machen darf, dann ist es offensichtlich ein schlechtes Programm.
Und deswegen macht man das nicht.
Und natürlich weil es total kontraintuitiv ist.
Vielen Dank! Deine Beiträge sind Top!

-
Huch. Danke
