Ich bin ein Anfänger in der Programmierung und ich lerne über Kopie Konstruktoren. Aus verschiedenen Quellen kann ich sehen, dass Kopierkonstruktoren nützlich sind, wenn ich ein Klassenobjekt "tief kopieren" möchte, so dass die Zeigerelemente des neuen Objekts auf neue Speicherorte zeigen.Kopieren Konstruktor und dynamischer Speicher
Meine Frage ist, was ist der Vorteil der Definition des Kopierkonstruktors wie in der Klasse CopyCat in meinem Beispiel, wenn ich das gleiche Ergebnis mit einem leeren Kopierkonstruktor bekomme (wie in der Klasse EmptyCat)?
Meine zweite Frage ist, warum funktionieren Klasse Cat und Klasse EmptyCat anders? Der einzige Unterschied zwischen ihnen ist, dass ich in EmptyCat einen leeren Kopierkonstruktor definiere. Aber während ich das Programm ausführe, sehe ich, dass in EmptyCat nach dem Kopieren das Zeigerelement auf eine neue Position zeigt, während es in der Klasse Cat als flache Kopie arbeitet.
#include "iostream"
class Cat
{
public:
void GetMem() { std::cout << itsAge << "\n"; }
private:
int * itsAge = new int;
};
class EmptyCat
{
public:
EmptyCat() {}
~EmptyCat() {}
EmptyCat(EmptyCat&obj) {}
void GetMem() { std::cout << itsAge << "\n"; }
private:
int * itsAge = new int;
};
class CopyCat
{
public:
CopyCat() {}
~CopyCat() {}
CopyCat(CopyCat&obj);
int GetAge() { return *itsAge; }
void GetMem() { std::cout << itsAge << "\n"; }
private:
int * itsAge = new int;
};
CopyCat::CopyCat(CopyCat & obj)
{
itsAge = new int;
*itsAge = obj.GetAge();
}
int main()
{
Cat Garfield;
Cat Kitty(Garfield);
std::cout << "Memory addresses for the objects' <itsAge> member:" << std::endl;
std::cout << "Garfield and Kitty (Class Cat):" << std::endl;
Garfield.GetMem();
Kitty.GetMem();
EmptyCat Meow;
EmptyCat Purr(Meow);
std::cout << std::endl << "Meow and Purr (Class EmptyCat):" << std::endl;
Meow.GetMem();
Purr.GetMem();
CopyCat Fluffy;
CopyCat Felix(Fluffy);
std::cout << std::endl << "Fluffy and Felix (Class CopyCat):" << std::endl;
Fluffy.GetMem();
Felix.GetMem();
system("pause");
return 0;
}
Wenn ich das Programm ausführen ich dieses:
Memory addresses for the objects' <itsAge> member:
Garfield and Kitty (Class Cat):
00BBDA60
00BBDA60
Meow and Purr (Class EmptyCat):
00BB46A0
00BB8280
Fluffy and Felix (Class CopyCat):
00BB82B0
00BBE8A0
Press any key to continue . . .
Ihre Klasse verliert Speicher, es ist also kein gutes Beispiel für irgendetwas. –
Ich wollte es so einfach wie möglich machen und konzentriere mich auf das Verhalten des Kopierkonstruktors – SVG
Aber damit vermisst du alles, was interessant ist. Wenn Ihr Destruktor die Zuweisung löschen würde, würden Sie sofort die Regel von drei und all das entdecken. –