constructor, copy constructor, destructor
-
habe ein kleines Programm geschrieben, um zu testen wieviel Aufwand wenn man ohne Referenzen in Parameterlist hat.
Person.hxx#include <iostream> using namespace std; class Person { public : Person(){ cout<<"call Person Ctor"<<endl; } virtual ~Person(){ cout<<"call Person DCtor"<<endl; } Person( const Person & s) { cout<<"call Person Copy Ctor"<<endl; } };Student.hxx
#include "Person.hxx" class Student : public Person { public : Student(){ cout<<"call Student Ctor"<<endl; } virtual ~Student(){ cout<<"call Student DCtor"<<endl; } Student( const Student &s) { cout<<"call Student Copy Ctor"<<endl; } };main.cpp #include "Student.hxx" Student showStudent(Student a) { return a; } void main() { Student aStudent; Student b = showStudent(aStudent); cin.get(); }Das Ergebnis:
call Person Ctor //erzeugen aStudent call Student Ctor //erzeugen aStudent call Person Ctor //erzeugen a call Student Copy Ctor //Student a = aStudent call Person Ctor //return a call Student Copy Ctor //Student b = a call Student DCtor //delete a call Person DCtor //delete Base "von a" call Student DCtor //delete b call Person DCtor //delete Base "von b" call Student DCtor //delete aStudent call Person DCtor //delete Base von "aStudent"Aber bei Student a = aStudent, wird nur Copy Ctor aufgerufen? wieso nicht Constructor von Person dann von Student?
-
Hallo,
der Copy Ctor spielt in deinem Programm nur beim Funktionsaufruf von showStudent und bei dem Rückgabewert eine Rolle. Danach kommt allerdings der Zuweisungsoperator ins Spiel (das '='), welcher bei deinen Klassen nicht überladen
ist und du deshalb auch keine Ausgabe erhalten kannst.
-
netrobot schrieb:
Aber bei Student a = aStudent, wird nur Copy Ctor aufgerufen? wieso nicht Constructor von Person dann von Student?
Um ein Objekt zu konstruieren, benötigst du einen Ctor-Aufruf (mal abgesehen von den indirekten Aufrufen zum Aufbau der Teilobjekte (Basis/Member). D.h. das Objekt wird entweder per Copy-Ctor, Default-Ctor oder eigenen Ctor erzeugt und ist dann komplett.
-
Nocternity schrieb:
Hallo,
der Copy Ctor spielt in deinem Programm nur beim Funktionsaufruf von showStudent und bei dem Rückgabewert eine Rolle. Danach kommt allerdings der Zuweisungsoperator ins Spiel (das '='), welcher bei deinen Klassen nicht überladen
ist und du deshalb auch keine Ausgabe erhalten kannst.Ein Zuweisungsoperator wird hier niergends aufgerufen. X x = y; ruft keinen Zuweisungsop auf. Auch wenn hier ein =-Zeichen steht. Siehe dazu:
http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=copyvsdirect#AnswAber bei Student a = aStudent, wird nur Copy Ctor aufgerufen? wieso nicht Constructor von Person dann von Student?
Hier wird der Copy-Ctor von Student aufgerufen, welcher, da du ihn so implementiert hast, den Standard-Ctor von Person aufruft.
Die Ausgabe für Student a = aStudent sollte also sein:
call Person Ctor
class Student Copy CtorBesser wäre es, wenn du den Copy-Ctor von Student so implementieren würdest:
Student( const Student &s) : Person(s) { cout<<"call Student Copy Ctor"<<endl; }So verhält er sich dann auch wie ein automatisch generierter. Er ruft als den Copy-Ctor der Basisklasse auf.
-
Student( const Student &s)
: Person(s)
{
cout<<"call Student Copy Ctor"<<endl;
}ja, das ist besser, es ruft zwar einen CTor mehr(copy CTor von Person),aber danach a und aStudent sind völlig identisch
-
netrobot schrieb:
ja, das ist besser, es ruft zwar einen CTor mehr(copy CTor von Person),aber danach a und aStudent sind völlig identisch
Wieso "mehr"? Diese Variante ruft lediglich einen anderen Ctor von Person auf als der aus deinem ursprünglichen Beispiel (statt des Default-Ctors den Copy-Ctor).
-
die beiden sind vom aussehen her also identisch...
-
netrobot schrieb:
die beiden sind vom aussehen her also identisch...
Ja

(genau genommen ist Copy-Ctor nur eine Sonderbezeichnung für den Parameter-Ctor, der mit einem einzelnen "const 'eigene_klasse'&" aufgerufen werden kann)
-
CStoll schrieb:
netrobot schrieb:
ja, das ist besser, es ruft zwar einen CTor mehr(copy CTor von Person),aber danach a und aStudent sind völlig identisch
Wieso "mehr"? Diese Variante ruft lediglich einen anderen Ctor von Person auf als der aus deinem ursprünglichen Beispiel (statt des Default-Ctors den Copy-Ctor).
nehmen wir an, in Ctor von Student schreibe ich nicht :Person(s)
beiStudent a = aStudentaStudent hat 2 Teile, der 1. von Person; der 2. von Student selber, falls der 1. Teil in aStudent was geändert wurde,
Student a = aStudenta hat nur den originalen Person-Teil, d.h. a und aStudent sind nicht identisch.
-
Deswegen ruft der Copy-Ctor von Student trotzdem genau einen Ctor von Person auf (wenn du es richtig gemacht hast, deren Copy-Ctor, wenn du dort nichts angibst, den Default-Ctor (das ist der ohne Parameter)) - aus deiner Sicht allerdings den falschen.