Forum: PC-Programmierung Muss man den Konstruktor/Destruktur immer hinschreiben (c++)


von Jeremyl (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Arc N. (arc)


Lesenswert?

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.

von C++11 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.