Hallo, wenn ich den Konstruktur und Destruktor in einer Klasse "nicht verwende", also der eigentlich Standard/leer ist. Muss man den dann in der .cpp Datei der Klasse trotzdem aufführen ? Oder kann ich den einfach weglassen (nicht das dann meine Objekte oder so nicht zerstört werden). Ich danke euch Viele Grüße
Jeremyl schrieb: > Hallo, > > wenn ich den Konstruktur und Destruktor in einer Klasse "nicht > verwende", schlecht ausgedrückt. Denn: verwendet wird ein Konstruktor immer dann, wenn ein Objekt erzeugt wird (und ein Destruktor immer dann wenn ein Objekt zerstört wird). > also der eigentlich Standard/leer ist. Jep. das ist legitim > Muss man den dann in > der .cpp Datei der Klasse trotzdem aufführen ? Oder kann ich den einfach > weglassen (nicht das dann meine Objekte oder so nicht zerstört werden). Du kannst ihn weglassen. Dann erzeugt sich der Compiler selber einen Defaultkonstruktor / Destruktor. Der Compiler kann sich 4 Member-Funktionen 'selbst schreiben', wenn du sie nicht schreibst * schreibst du keinen Konstruktor, dann erzeugt sich der Compiler selbst einen Default Konstruktor * schreibst du keinen Copy-Konstruktor, dann erzeugt sich der Compiler selbst einen * schreibst du keinen Operator=, dann macht sich der Compiler selber einen * schreibst du keinen Destruktor, dann macht sich der Compiler selber einen All diesen vom Compiler erzeugten Funktionen ist gemeinsam, dass sie sinngemäs einfach nur den Aufruf an alle Member 'weitergeben'. Ein erzeugter Op= sorgt also dafür, dass alle Member mittels einem Op= zugewiesen werden. Ein erzeugter Copy-Constructor sorgt dafür, dass der Copy Constructor aller Member aufgerufen wird, etc. etc. Das ist oft genau das was du willst, aber nicht immer. Speziell wenn dynamisches Resource-Management im Spiel ist, dann reicht das nicht. So was
1 | class meineKlasse |
2 | {
|
3 | |
4 | protected:
|
5 | std::string name_; |
6 | };
|
ist also völlig legitim und macht genau das was du willst. Auch der name_ wird korrekt behandelt, obwohl du selbst keinen Konstruktor/Destruktor/Op=/Copy Konstruktor geschrieben hast. Die Compiler-generierten machen genau das richtige.
Karl Heinz Buchegger schrieb: > Jeremyl schrieb: >> Hallo, >> >> wenn ich den Konstruktur und Destruktor in einer Klasse "nicht >> verwende", > > schlecht ausgedrückt. > Denn: verwendet wird ein Konstruktor immer dann, wenn ein Objekt erzeugt > wird > (und ein Destruktor immer dann wenn ein Objekt zerstört wird). > >> also der eigentlich Standard/leer ist. > > Jep. das ist legitim Hatte da letztens noch einen schönen Kommentar zu gelesen: http://www.scs.stanford.edu/~stutsman/ramcloud/style/cppguide.xml Decision: If your class defines member variables and has no other constructors you must define a default constructor (one that takes no arguments). It should preferably initialize the object in such a way that its internal state is consistent and valid. The reason for this is that if you have no other constructors and do not define a default constructor, the compiler will generate one for you. This compiler generated constructor may not initialize your object sensibly. If your class inherits from an existing class but you add no new member variables, you are not required to have a default constructor. Zum Copy-Konstruktor und Zuweisungsoperator gibt's da ebenso eine meiner Meinung nach sinnvolle Empfehlung: Decision: Few classes need to be copyable. Most should have neither a copy constructor nor an assignment operator... If your class does not need a copy constructor or assignment operator, you must explicitly disable them.
Nur der Vollständigkeit halber: Ab C++11 sollte man auch die "move semantics" beachten.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.