No, un costruttore di object
è molto diverso da una funzione chiamata object
e restituisce object
. Un costruttore non ha un nome, ma è in gran parte un tecnicismo. Le differenze più importanti sono che un costruttore non ha un tipo di ritorno e che non può essere chiamato direttamente.
Un costruttore non restituisce nulla perché riceve un blocco di memoria e opera su quella memoria sul posto. Potrebbe essere utile se si dimentica il nome "costruttore" per un momento e si pensa come inizializzatore . Lo scopo del costruttore è non di costruire un oggetto "dal nulla". Il suo scopo è inizializzare un oggetto nel punto preciso in cui deve essere posizionato.
Se un costruttore doveva restituire un oggetto, quell'oggetto restituito (il valore restituito) avrebbe dovuto vivere da qualche parte (probabilmente nello stack), e lì, avrebbe dovuto essere inizializzato in qualche modo - stiamo andando a fare un giro qui.
Questo va di pari passo con il fatto che un costruttore non può mai essere chiamato direttamente. Se hai una classe object
e utilizzi un'espressione object()
da qualche parte, non ha la semantica di "chiama il costruttore di object
". Ha la semantica di "creare un oggetto temporaneo di tipo object
". Il compilatore lo traduce nell'assegnare un posto dove il temporaneo possa vivere (probabilmente / comunemente nello stack), e chiama il costruttore per costruire (= inizializzare) un oggetto in quel luogo.
Lo stesso principio si applica quando si usa new object()
. Questa è una nuova espressione, che fa due cose:
- Chiama una funzione di allocazione
operator new
(che restituisce un void*
) per allocare la memoria non elaborata per l'oggetto.
- Emettere una chiamata al costruttore su questa memoria non elaborata per costruire (= inizializzare) un oggetto in quel pezzo di memoria non elaborata.
Pensando a un costruttore di object
come una funzione come questa:
static object object();
è sbagliato. Se mai, il modo in cui un costruttore lavora è più vicino a questo:
static void object(object &place_to_work_in);
Con l'eccezione che puoi mai chiamarlo direttamente. È sempre chiamato solo quando specificato da un costrutto di linguaggio diverso. Anche il posizionamento nuovo (noto anche come trucco "chiama un costruttore qui"), new (&place_for_object) object()
, non chiama direttamente il costruttore. Si traduce in una chiamata al posizionamento, nuova forma di operator new
che restituisce il suo argomento, seguito da una chiamata al costruttore (proprio come qualsiasi altra nuova espressione).