ich das gleiche in C++ verwenden können, wie diese [...] Wo Konstruktor obligatorisch ist. Von this tutorial Ich habe, dass wir so ein Objekt erstellen können [...] die keinen Konstruktor benötigen.
Das ist falsch. Ein Konstruktor muss vorhanden sein, um ein Objekt zu erstellen. Der Konstruktor könnte implizit vom Compiler unter bestimmten Bedingungen definiert werden, wenn Sie keine angeben, aber eventuell muss der Konstruktor vorhanden sein, wenn ein Objekt instanziiert werden soll. Tatsächlich ist die Lebensdauer eines Objekts so definiert, dass es beginnt, wenn die Konstruktorroutine zurückkehrt.
Von Ziffer 3.8/1 des C++ 11 Standard:
[...] Die Lebensdauer eines Objekt vom Typ T beginnt, wenn:
- Speicher mit der richtigen Ausrichtung und Größe für Typ T erhalten, und
- Wenn das Objekt nicht-triviale Initialisierung hat, ist seine Initialisierung abgeschlossen.
Daher muss ein Konstruktor vorhanden sein.
1) Was ist der Unterschied zwischen beiden Arten der Erstellung von Klassenobjekten?
Wenn Sie instanziiert Objekt mit automatischer Speicherdauer, wie folgt aus (wo X
etwas Klasse ist):
X x;
Sie ein Objekt erstellen, die automatisch zerstört wird, wenn es den Gültigkeitsbereich verlässt. Auf der anderen Seite, wenn Sie das tun:
X* x = new X();
Sie erstellen ein Objekt dynamisch und Sie binden ihre Adresse in einen Zeiger.Auf diese Weise wird das von Ihnen erstellte Objekt nicht zerstört, wenn Ihr Zeiger x
den Gültigkeitsbereich verlässt.
in der modernen C++, wird dies als eine zweifelhafte Programmierpraxis angesehen: obwohl Zeiger sind wichtig, weil sie reference semantics, roh Zeiger sind schlecht zu realisieren erlauben, weil sie in Speicherlecks (Objekte outliving alle ihre Zeiger und führen niemals zerstört werden) oder in ungeeigneten Zeigern (Zeiger, die das Objekt, auf das sie zeigen, überlebten und bei der Dereferenzierung möglicherweise Undefined Behavior verursachen).
In der Tat, wenn ein Objekt mit new
Erstellen Sie immer müssen bedenken, es mit delete
zu zerstören:
delete x;
Wenn Sie Referenzsemantik benötigen und sind gezwungen, Zeiger zu verwenden, in C++ 11
std::shared_ptr<X> x = std::make_shared<X>();
intelligente Zeiger kümmern Speicher-Management-Themen, die wh ist: Sie sollten mit Smart Pointer stattdessen betrachten gibt dir Kopfschmerzen mit rohen Zeigern. Intelligente Zeiger sind in der Tat fast das gleiche wie Java oder C# Objektreferenzen. Das "fast" ist notwendig, da der Programmierer darauf achten muss, keine zyklischen Abhängigkeiten durch das Vorhandensein von Smartpointern einzuführen.
2) Wenn ich Objekt wie Beispiel Beispiel erstelle; wie man das in einer Singleton-Klasse benutzt.
Sie könnten so etwas wie dieser (vereinfachte Code) tun:
struct Example
{
static Example& instance()
{
static Example example;
return example;
}
private:
Example() { }
Example(Example const&) = delete;
Example(Example&&) = delete;
Example& operator = (Example const&) = delete;
Example& operator = (Example&&) = delete;
};
Es kann angemerkt werden, dass der leere Konstruktor aufgerufen wird, auch wenn der Ausdruck ohne Klammern ist. – jiggunjer