FIXME ausformulieren Kern-Idee: Kopierkonstruktor und operator= sollten implementiert werden, wenn mit dynamischen Speicherallokierungen gearbeitet wird, damit diese bei der Verwendung von operator= richtig verwendet werden (d.h. entweder Zeiger übernommen oder neue Zeiger mit gleichen Werten, dann aber alten Zeiger auch löschen!) #include class SimplePerson { private: std::string name; int* finger; public: SimplePerson(std::string const & name, int const zahl) // benutze Copy-Ctor von std::string : name(name) , finger(new int(zahl)) { std::cout << this << ": " << this->name << " wurde geboren und " << "zeigt auf " << this->finger << " (" << *(this->finger) << ")" << std::endl; } virtual ~SimplePerson() { std::cout << this << ": " << this->name << " ist verstorben und " << "zeigte auf " << this->finger << " (" << *(this->finger) << ")" << std::endl; delete this->finger; } void print() { std::cout << this << ": " << this->name << " zeigt auf " << this->finger << " (" << *(this->finger) << ")" << std::endl; } }; class ComplexePerson { private: std::string name; int* finger; public: ComplexePerson(std::string const & name, int const zahl) // benutze Copy-Ctor von std::string : name(name) , finger(new int(zahl)) { std::cout << this << ": " << this->name << " wurde geboren und " << "zeigt auf " << this->finger << " (" << *(this->finger) << ")" << std::endl; } ComplexePerson(ComplexePerson const & other) // benutze Copy-Ctor von std::string : name(other.name) , finger(new int(*(other.finger))) { std::cout << this << ": " << this->name << " wurde aus " << &other << " geklont und zeigt nun auf " << this->finger << " (" << *(this->finger) << ")" << std::endl; } virtual ~ComplexePerson() { std::cout << this << ": " << this->name << " ist verstorben und " << "zeigte auf " << this->finger << " (" << *(this->finger) << ")" << std::endl; delete this->finger; } ComplexePerson operator=(ComplexePerson const & other) { std::cout << this << ": " << this->name << " zeigte auf " << this->finger << " (" << *(this->finger) << ")" << " und wird ersetzt von " << other.name << " aus " << &other << " ersetzt"; delete this->finger; // benutze Copy-Ctor von std::string this->name = other.name; this->finger = new int(*(other.finger)); std::cout << " und zeigt nun auf " << this->finger << " (" << *(this->finger) << ")" << std::endl; // dereferenziere this return *this; } void print() { std::cout << this << ": " << this->name << " zeigt auf " << this->finger << " (" << *(this->finger) << ")" << std::endl; } }; void simpleTest() { SimplePerson s1("Hansi", 3); SimplePerson s2("Peter", 9); std::cout << "copy ctor" << std::endl; SimplePerson s3(s1); // Hansi mittels copy-ctor klonen std::cout << "operator=" << std::endl; s2 = s1; // Hansi mittels operator= klonen std::cout << "print" << std::endl; s1.print(); s2.print(); s3.print(); } void complexeTest() { ComplexePerson p1("Hansi", 3); ComplexePerson p2("Peter", 9); std::cout << "copy ctor" << std::endl; ComplexePerson p3(p1); // Hansi mittels copy-ctor klonen std::cout << "operator=" << std::endl; p2 = p1; // Hansi mittels operator= klonen std::cout << "print" << std::endl; p1.print(); p2.print(); p3.print(); } int main() { //simpleTest(); std::cout << "-------------------------" << std::endl; complexeTest(); }