Deklarieren ohne Definieren von Konstruktor und Destruktor
-
Es ist egal, ob man den Konstruktor / Destruktor definiert oder nicht
Zitat mikey aus einem andern Thread. Im angegeben Code sind Konstruktor und Destruktor aber deklariert.
Ich dachte eigentlich bisher, wenn Destruktor und Konstruktor nicht DEKLARIERT sind erstellt der Compiler eine Definition davon. Funktionniert das tatsächlich auch wenn man sie deklariert und bloß eben nicht definiert? Kanns gerade leider nicht testen, darum frage ich hier nach.
-
Ich dachte eigentlich bisher, wenn Destruktor und Konstruktor nicht DEKLARIERT sind erstellt der Compiler eine Definition davon.
Das stimmt. Dann erstellt der Compiler einen leeren Standardkonstruktor.
Funktionniert das tatsächlich auch wenn man sie deklariert und bloß eben nicht definiert?
Jop, das funktioniert, zumindest wird es kompiliert.
MfG mikey.
-
mikey schrieb:
Funktionniert das tatsächlich auch wenn man sie deklariert und bloß eben nicht definiert?
Jop, das funktioniert, zumindest wird es kompiliert.
Da muss man aber schon eine eigenartige Bedeutung von "funktioniert" annehmen. Ich würde auf die Frage des OPs eindeutig mit "nein" antworten. Zum einen bezieht sich das "funktioniert", so wie ich das verstehe, auf "erstellt der Compiler eine Definition davon" und das tut er nicht, wenn man einen Ctor/Dtor deklariert, aber nicht definiert. Zum anderen wird solcher Code zwar übersetzt, man erhält aber am Ende kein ausführbares Programm, da Aufrufe des besagten Ctos/Dtors nicht aufgelöst werden können.
-
Es gilt:
Wenn du keinen Standartkonstruktur/-destruktor deklarierst, macht das der Compiler für dich, solange du keinen anderen Konstruktor/Destruktor deklariert hast.Gruß TheImaginator
-
Gut, dann hatte ich das doch richtig verstanden. Im, andern Thread wurde es auch nochmal aufgegriffen.
Danke an euch.
-
Es funktioniert, solange man eben den deklarierten-aber-nicht-definierten Konstruktor nicht aufruft.
Mit dem Copy-Konstruktor wird das oft so gemacht (meist gemeinsam mit dem Assignment Operator, um Klassen "nicht kopierbar" zu machen), und zwar deklariert man den dann private, und lässt die Definition weg. Damit ist sichergestellt dass die Funktion eben nicht aufgerufen werden kann.
Allerdings kann ich jetzt auch keinen Sinn darin finden den Default Konstruktor zu deklarieren aber nicht zu definieren. Irgendeinen Konstruktor braucht man schliesslich wenn man eine Klasse instanzieren will, und sobald man einen definiert, wird eh kein Default Konstruktor mehr automatisch herbeigezaubert...
*hmmmm*
-
Ich dachte eigentlich bisher, wenn Destruktor und Konstruktor nicht DEKLARIERT sind erstellt der Compiler eine Definition davon.
Wenn du keinen Konstruktor deklarierst, deklariert der Compiler einen Defaultkonstruktor. Erst wenn du in Folge ein Objekt erzeugen willst, dass den Defaultkonstruktor aufrufen würde, wird dieser implizit definiert. Der Unterschied ist praktisch nicht von Bedeutung (abgesehen davon, dass die Diagnose erst später erfolgt), denn der einzige Fall, in dem die Deklaration des Konstruktors wichtig sein könnte, ohne dass eine Definition benötigt wird, dürfte in einem sizeof-Ausdruck bestehen. Grundsätzlich ist aber eine Klassendefinition nicht deshalb fehlerhaft, weil es unmöglich ist, ein Objekt dieser Klasse zu erstellen.
-
Im genannten Fall (also im andern Thread) sollten aber soweit ich mich erinnere Instanyen der Klasse angelegt werden.
Vielen Dank für die ausführlichen Erklärungen, ich denk jetzt hab ichs ganz verstanden.