Der standardmäßige Kopierkonstruktor bewirkt oft, dass zwei Objekte auf einen gemeinsamen Speicherbereich "zeigen". Dies liegt daran, dass der Standard-Kopierkonstruktor nur eine Memberwise-Zuweisung ist. Wenn Sie also ein Zeiger Mitglied haben, kann dies Sie in Schwierigkeiten geraten
CClass::CClass(const CClass& src)
{
// these two point to the same place in memory now
// you really aught to allocate new memory
m_ptr = src.m_ptr;
// not a big deal for members that aren't "pointing" elsewhere
// this copy works great
m_int = src.m_int;
}
Sie im Wesentlichen wollen nicht in einer Situation enden, wo zwei Instanzen „zeigt auf“ den gleichen Platz im Speicher. Dies kann passieren, wenn Sie Zeiger als Elemente haben, die auf dynamisch zugewiesenen Speicher verweisen. Dies kann auch mit Referenzen geschehen, die sich auf etwas außerhalb der Klasse selbst beziehen. Dies kann bei Dateihandles auftreten, bei denen Sie möglicherweise eine neue Datei duplizieren/erneut öffnen müssen.
In der Tat ist der letztere Fall wahrscheinlich am einfachsten zu konzipieren. Stellen Sie so, als ob Ihre 2 C++ - Objekte eine Protokolldatei hätten. Ohne einen korrekt funktionierenden Kopierkonstruktor könnten sie sich beide in derselben Datei anmelden. Was passiert, wenn in den Klassen destructor die Datei geschlossen wird? Nun, das zweite C++ Objekt wird seine Protokolldatei unter sich geschlossen haben. Eine Lösung wäre, einen Kopierkonstruktor zu erstellen, der eine neue Datei für die neu erstellte Instanz erstellt. Wenn also das erste C++ Objekt verschwindet, nimmt es die Protokolldatei des 2. C++ Objekts nicht mehr mit. Sie haben 2 unabhängige Protokolldateien, sie können sich nicht gegenseitig stören.
Dieses Beispiel kann auf dynamischen Speicher erweitert werden. Ohne einen Kopierkonstruktor haben Sie nur 2 Zeiger, die auf dieselbe Adresse zeigen. Wenn der Destruktor von einem diesen Speicher löscht, erkennt der andere möglicherweise nicht, dass der Speicher, auf den er zeigt, verschwunden ist. Genauso wichtig ist es wahrscheinlich, dass Sie nicht wollen, dass ein Objekt in das Mitglied des anderen Objekts schreibt :).
Soweit ich verstehe (und handle) - eine zusätzliche gute Praxis (nicht die anderen Antworten hier zurückziehen) wird folgen "Die Regel der drei": https://stackoverflow.com/q/4172722/1971003 –