Nein, ein Konstruktor von unterscheidet object
sich stark von einer Funktion, die aufgerufen wird object
und zurückkehrt object
. Ein Konstruktor hat keinen Namen, aber das ist größtenteils eine technische Angelegenheit. Die wichtigeren Unterschiede sind, dass ein Konstruktor keinen Rückgabetyp hat und nicht direkt aufgerufen werden kann.
Ein Konstruktor gibt nichts zurück, da er einen Speicherblock erhält und diesen Speicher direkt bearbeitet. Es kann hilfreich sein, wenn Sie den Namen "Konstruktor" für einen Moment vergessen und ihn stattdessen als Initialisierer betrachten . Der Zweck des Konstruktors besteht nicht darin, ein Objekt "aus der Luft" zu konstruieren. Ihr Zweck ist es, ein Objekt genau dort zu initialisieren, wo es sein muss.
Wenn ein Konstruktor ein Objekt zurückgeben würde, müsste dieses zurückgegebene Objekt (der Rückgabewert) irgendwo (wahrscheinlich auf dem Stapel) leben, und dort müsste es irgendwie initialisiert werden - wir stoßen hier auf eine Schleife.
Dies geht einher mit der Tatsache, dass ein Konstruktor niemals direkt aufgerufen werden kann. Wenn Sie eine Klasse haben object
und object()
irgendwo einen Ausdruck verwenden , hat dieser nicht die Semantik "Aufruf des Konstruktors von object
". Es hat die Semantik "ein temporäres Objekt vom Typ erstellen object
". Der Compiler übersetzt dies in die Zuweisung eines Ortes, an dem das temporäre Objekt leben soll (wahrscheinlich / häufig auf dem Stapel), und den Aufruf des Konstruktors, ein Objekt an diesem Ort zu konstruieren (= zu initialisieren).
Das gleiche Prinzip gilt bei der Verwendung new object()
. Dies ist ein neuer Ausdruck, der zwei Dinge tut:
- Rufen Sie eine Zuordnungsfunktion
operator new
(die a zurückgibt void*
) auf, um dem Objekt Rohspeicher zuzuweisen.
- Setzen Sie einen Konstruktoraufruf für diesen Rohspeicher ab, um ein Objekt in diesem Rohspeicher zu erstellen (= zu initialisieren).
Stellen Sie sich einen Konstruktor object
als eine Funktion wie diese vor:
static object object();
ist falsch. Wenn überhaupt, ist die Arbeitsweise eines Konstruktors näher daran:
static void object(object &place_to_work_in);
Mit der Ausnahme, dass Sie es nie direkt aufrufen können. Es wird immer nur aufgerufen, wenn es von einem anderen Sprachkonstrukt angegeben wird. Selbst eine neue Platzierung (auch als Trick "Konstruktor hier aufrufen" bezeichnet) new (&place_for_object) object()
ruft den Konstruktor nicht direkt auf. Es wird in einen Aufruf der platzierungsneuen Form übersetzt operator new
, deren Argument zurückgegeben wird, gefolgt von einem Aufruf des Konstruktors (genau wie bei jedem anderen neuen Ausdruck).