Können Sie aufrufen eines instanziierten Objekts Konstruktor der Klasse ausdrücklich in C++?
Nach dem erstellen einer Instanz einer Klasse, können rufen wir den Konstruktor explizit?
Zum Beispiel
class A{
A(int a)
{
}
}
A instance;
instance.A(2);
Können wir dies tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie die Platzierung neu: http://en.wikipedia.org/wiki/Placement_new, die erlaubt,
Allerdings aus deinem Beispiel würde man ruft einen Konstruktor für ein Objekt zweimal die sehr schlechte Praxis. Stattdessen würde ich empfehlen, die Sie gerade tun
Placement-new wird in der Regel nur verwendet, wenn Sie brauchen, um preallocate den Speicher z.B. in einem benutzerdefinierten Speicher-manager.
Nicht.
Erstellen Sie eine Methode für das setzen und rufen Sie es aus dem Konstruktor. Diese Methode wird dann auch für später.
Du wirst wahrscheinlich auch wollen, einen default-Wert oder den default-Konstruktor.
Kein
In der Regel, wenn eine Funktion/Funktionalität ist es erforderlich, im Konstruktor als auch nach Objekt ist construted es ist platziert in der init () - methode und verwendet im Konstruktor und in den anderen Ort zu.
Beispiel:
Ich bin mir ziemlich sicher, dass Sie das nicht können.
Das ist der springende Punkt-Konstruktor Erzeugung einer Instanz der Klasse.
Wenn ein Konstruktor gar nicht aufgerufen, oder ist zweimal genannt, - welche Konsequenzen könnte es haben?
Was Sie tun konnte, natürlich, ist die Gewinnung einige Konstruktor-Logik in der Methode, und der Aufruf der Methode im Konstruktor und nach der Erstellung des Objekts.
Durch die Art und Weise, das klingt nach einem Designfehler. Sobald ein Objekt konstruiert wird, sollte es nie eine Notwendigkeit zu re-konstruieren. Solche Variablennamen wiederverwenden, macht den code eher schwieriger zu verstehen. Aus diesem Grund machen Konstruktor-Funktionen verfügbar, über eine zusätzliche Funktion
init
oderset
ist oft falsch (aber manchmal unvermeidlich).Als Michael sagte, die Platzierung neuer könnte hier eingesetzt werden, ist aber eigentlich gedacht für unterschiedliche Verwendungszwecke. Auch, vor der Erstellung eines neuen Objekts in einem Speicher Speicherort, müssen Sie explizit löschen Sie das alte Objekt:
Auch
placement new
können abgeneigt Effekt auf Ihr Gedächtnis, da überlastungen können erwarten, dass die Speicher übergeben wird, gehört zu den Haufen! Fazit: nicht. tun. dies.BEARBEITEN, um Zu demonstrieren, dass der Aufruf des destruktors ist wirklich notwendig ist (für nicht-POD), betrachten Sie das folgende Beispiel-code:
Wie erwartet, das Programm erzeugt die folgende Ausgabe:
... was bedeutet, dass der Destruktor für das erste Objekt ist nicht genannt. Das gleiche gilt für Ressourcen, die
A
möglicherweise erworben haben.placement new
weil der Destruktor ist definitiv nicht automatisch aufgerufen, aber hat aufgerufen werden manuell (siehe update zu meinem posting).Nein, Sie können das nicht tun. Der einzige Weg zum aufrufen eines Konstruktors mit dem Schlüsselwort "new".
Nur zu fassen, die drei Möglichkeiten zur Angabe der expliziten Konstruktor werden über
Einer Instanz(2); //übernimmt Eine Instanz = 2; überhaupt funktionieren?
Einer *Instanz = new A(2); //wird nie sicher & versus * hier, mich
neuen (&Instanz) A(2);
und Aromen von denen. Der
IdeeZiel ist zu vereinbaren, dass zu keiner Zeit ein Objekt konstruiert, die nicht in einem ordnungsgemäßen Zustand initialisiert und Konstruktoren sind entworfen, um sicherzustellen, dass. (Dies bedeutet, dass Methoden nicht zu überprüfen, ob einige .init (...) - Methode wurde erfolgreich aufgerufen wird oder nicht).Diese erscheint mir als die mehr-funktionellen Weg zu gehen, vor allem für Klassen, die Teile des frameworks wiederverwendet, die in Bibliotheken. Wenn es das ist, was Sie interessiert sind, arbeiten darauf hin, dass alle Konstruktoren, einschließlich Standard-ein, liefern einen voll funktionsfähigen Instanz.
Ausnahme-Fällen: Es gibt Dinge, die Sie möglicherweise nicht in der Konstruktor-operation, wenn es möglich ist, für Sie zu scheitern, wenn es angebracht ist zu werfen eine exception aus dem Konstruktor. Und einige Leute wie, dass Sie "leere" Instanzen, propogated mit nachfolgenden Methoden und auch ausgesetzt-zu-Initialisierung Mitglieder. Es ist interessant, zu erforschen, Möglichkeiten zur Entschärfung solcher Situationen und robuste Instanzen, die nicht über schlechte Zustände, die geschützt werden müssen gegen die in den Implementierungen von Methoden und in der Nutzung.
PS: In einigen komplexen Fällen kann es nützlich sein, um eine initialisierte Instanz (Referenz) geliefert werden als das Ergebnis einer Funktion oder einer Methode auf eine "factory" - Klasse, so dass die zwischen -, unter-setup-Instanz noch nie gesehen, außerhalb der Kapselung Fabrik Instanz der Klasse oder-Funktion. Das gibt uns,
+4. Eine *Instanz = MakeAnA(2);
+5. Eine *Instanz = InterestingClass.A(2);
*
hier statt einer&
da es ein pointer). Für das auslösen von Ausnahmen von Konstruktoren, das ist angebracht und muss behandelt werden.