In welchen Fällen gibt es keinen Konstruktor, auch ein default-Konstruktor?
In dieses Buch ich bin gerade Lesen, ich lief über diese:
Einer Klasse braucht keinen Konstruktor. Ein default-Konstruktor ist nicht nötig, wenn das Objekt braucht keine Initialisierung.
Gehe ich Recht in der Herleitung aus der obigen, dass der compiler nicht generiert einen Standardkonstruktor für die Klasse/Struktur in einigen Fällen? Wenn ja, welches sind diese Fälle? Ich werde hinkommen und sagen-POD ist wohl einer. Gibt es noch andere?
EDIT: ich habe den Titel geändert, da der ursprüngliche Titel gab, die Bedeutung, die ich fragte, Wann wurde ein default-Konstruktor nicht definiert, anstatt zu Fragen, Wann hat eine Klasse keinen Konstruktor an alle.
- Hinweis: "default-Konstruktor" ist nicht ein synonym für "compiler generierten Konstruktor".
- Ein default-Konstruktor wird immer dann erzeugt, aber es ist nicht immer genannt. Betrachten Sie eine lokale variable, die nicht const ist, ist der POD-Typ, und erklärt wird, ohne eine Initialisierung. Das Objekt ist Kopfsteinpflaster bis aus dem Speicher. Auch wenn der default-Konstruktor existiert, ist es nicht genannt zu konstruieren, das Objekt. Die Daten haben die Mitglieder unbestimmten Wert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, der Autor spricht über diese situation:
Unter Umständen wird ein Konstruktor nicht aufgerufen werden, Punkt. Sobald Sie schreiben ein Konstruktor, der Sie nicht über eine POD-Klasse, so, nun wird der Konstruktor aufgerufen wird.
Ob es eine gute oder schlechte Sache zu haben, ein Objekt herum laufen, die enthält zufällige, nicht initialisierte Daten ist eine andere Frage völlig.
"Under some circumstances a constructor won't be called, period"
durch ein Zitat (die standard-oder vielleicht zerlegen). Ich werde dann markieren Sie diese als Antwort statt (+1)POD_type
Sie erklärte genutzt werden kann (durch AufrufPOD_type.someVar
), aber seine Mitglieder sind nicht initialisiert, weil es keine member-Funktionen (Konstruktoren oder anderweitig)... richtig?Einen default-Konstruktor ist immer deklariert. Aber es ist nicht immer definiert. Nur, wenn es verwendet wird, dann wird der compiler (oder Sie) definieren. Beispiele:
Beachten Sie, dass das hat direkte praktische Konsequenzen
typedef struct A { int a; }A;
, dann EingabeA a;
erzeugt keinen Konstruktor hat es (ich dachte, das war die definition eines POD-Struktur)? Warum ist es anders im obigen Beispiel? Ist es einfach, weil wir sind jetzt Umgang mit C++?A a;
, weil es nicht den Aufruf eines Konstruktors in den ersten Platz. Aber im C++0x-es erzeugt einen Konstruktor und ruft Sie auf. Das Endergebnis ist jedoch das gleiche. Die Spezifikation in C++0x ist einfacher und hat weniger speziellen Fällen. Sie als Benutzer nicht den Unterschied bemerken, wenn.when it comes to C++, a random e-book does not trump the ISO C++ Standard
. Meine Frage löste den Begriff POD. Da C nicht über den Begriff der Ctors/Dtors (daher Hilfskonstruktionen wie stackoverflow.com/questions/537244/constructor-in-c/...) ich vermutete, dass in C++ eine Struktur, daß ein POD nicht bekommen würde, einen Ctor/Dtor, weil es teuer ist (auch wenn es einen geringen Kosten - ich habe gelesen, Zeit und Zeit wieder, in C/C++, zahlen Sie nicht für, was Sie nicht benutzen [z.B. Zeiger nicht zuerst entsprechend formatiert auf NULL automatisch]) und daher die Frage.compilers are so good
.Wenn du immer erstellen, die Objekte einer Klasse mit einem Konstruktor mit Parametern es müssen nicht die Standard-Konstruktor.
Generiert der compiler einen default-Konstruktor für jede Klasse, aber wenn Sie definieren Ihre eigenen Konstruktor für die Klasse dann nicht der compiler generiert einen Standardkonstruktor von selbst. So lange, wie Sie Objekte erstellen, die von solch einer Klasse über den Konstruktor, den Sie, die Klasse nicht mehr brauchen und haben einen default-Konstruktor.
Im Rahmen des oben genannten Beispiel, betrachten Sie das Zitat aus dem Buch:
Im obigen Beispiel, solange das Objekt der
Myclass
erstellt wird, in der mit #1 die Klasse nicht erforderlich ist und ein Standard-Konstruktor.Den Standard-Konstruktor muß definiert werden, für die Klasse, wenn ein Objekt der
Myclass
erstellt wird, in einer Weise, die den Bedürfnissen der Standard-Konstruktor, ich.e: #2.Meiner Meinung nach, dass der Satz bedeutet, dass man nicht immer haben, um schreiben Sie Ihre eigenen Standard-Konstruktor, da einige Klassen können nicht initialisiert werden müssen standardmäßig.
Zum Beispiel, wenn Ihre Klasse enthält mehrere class-Felder, die Ihre eigenen Standard-Konstruktor brauchen Sie nicht zu schreiben, Standard-Konstruktor, da die Mitglieder der Konstruktor aufgerufen wird sowieso standardmäßig.
In das extreme Gegenteil, Sie können schreiben wollen
struct
oder eineclass
von Hülsen, für die Sie sich darauf verlassen, dass der Programmierer korrekt initialisiert seine Felder manuell; in diesem Fall können Sie nicht schreiben Sie einen default-Konstruktor, so wird der compiler schreibt seine eigenen verlassen, dass diese Felder auf Ihre Standardwerte nicht initialisierte Werte (eigentlich ist es ein no-op, und wird wahrscheinlich optimiert werden entfernt).Der compiler deklariert und definiert eine automatisch generierte default-Konstruktor, wenn Sie noch nicht jeder Konstruktor.
Mit einem nicht-instanziierbaren übergeordneten Klasse es ist jedoch möglich um zu verhindern, dass jede Art von Konstruktor von der Arbeit. Durch hinzufügen einer dummy-Konstruktor mit einem dummy-parameter, ist es möglich zu töten nur die automatisch generierten Standard-Konstruktor, auf Kosten von mehr Bürokratie.
Gibt es gewisse Ambiguität, die in Ihrer Frage. Sie sehen, die impliziten Aktionen, die der compiler nimmt Bezug auf die Konstruktoren beinhalten sowohl deklarieren Sie und definieren Sie. Wenn einige Konstruktor deklariert, aber nicht definiert, halten Sie es gibt oder nicht?
Sowieso, es gibt keine Möglichkeit, eine Klasse zu erstellen, die keine Konstruktoren erklärt für Sie. Der copy Konstruktor, für ein Beispiel, ist immer deklariert. Es gibt keine Möglichkeit, es zu unterdrücken. Wenn Sie nicht, erklären Sie es selbst, die compiler erklären, es für Sie.
Als für die Standard-Konstruktor - ist es möglich zu unterdrücken, seine implizite Deklaration. Wenn Sie erklären alle Konstruktor selbst (also explizit), wird der compiler nicht implizit deklarieren Sie die Standard-Einstellung. Aber in diesem Fall Ihre Klasse, haben natürlich einen Konstruktor: die eine, Sie erklärt sich selbst. (Plus, wie ich oben sagte, der copy-Konstruktor wird immer deklariert).
Als für implizit definiert Konstruktoren... Sie sind definiert durch den compiler nur dann, wenn Sie Sie verwenden. Und, natürlich, Sie sind nur definiert, wenn es möglich ist. (Wenn Sie verwenden einen impliziten Konstruktor, und es erweist sich als unmöglich zu definieren, dann ist dein Programm einfach nicht kompilieren).
Also noch einmal, wenn es um erklärt Konstruktoren, ist es nicht möglich, dass eine Klasse keine Konstruktoren überhaupt. Jede Klasse hat mindestens einen Konstruktor deklariert es.
Wenn Ihr Interesse an definiert Konstruktoren explizit, dann ist es durchaus möglich, dass eine Klasse, die keinen Konstruktor definiert ist. Hier ist ein Beispiel für Sie
Das ist es. Die Klasse hat einen Konstruktor deklariert, aber es ist nicht definiert 🙂
Einen default-Konstruktor ist nicht für eine Klasse definiert, wenn ein anderer Konstruktor deklariert ist.
Für POD-Typen (in dem Sinne, dass sowohl trivial und standard-layout, wie diese Begriffe definiert, die in C++11) es ist ein strittiger Punkt, ob der compiler einen Konstruktor oder nicht, da der compiler generierten Konstruktoren sind trivial. Für die blutigen details, haben Sie einen Blick auf Was sind Aggregaten und PODs und wie/warum sind Sie besonders?
So einfach gesagt (im Zusammenhang mit CPP)
Wenn kein Konstruktor definiert ist, dann compiler keinen default-Konstruktor.
Es wird definiert, indem der compiler nur, wenn es erforderlich ist.
Gibt es bestimmte Fälle, in denen es getan wird durch den compiler. Einige von denen sind -
Wir haben ein container-Objekt. Code unten erklärt dies.
Im Fall von Virtuellen Funktionen, die Einstellung der Virtuellen Tabelle Zeiger auf die richtige V-Tabelle erfolgt im Konstruktor. Aus diesem Grund ist auch der default-Konstruktor wird definiert durch den compiler.
some_type some_function () {
POD_type this_is_intentionally_uninitialized;
...
}