Object obj();
non è un'istanza di oggetto, è una dichiarazione di una funzione obj
che non prende argomenti e restituisce un'istanza di Object
.
Object obj;
è un default initialization
, cioè istanziazione con il costruttore implicito (quindi, costruttore di default implicito o definite dall'utente non explicit
costruttore senza parametri), e questa dichiarazione chiamate costruttori implicite di-POD non Object
membri, e per I tipi POD non li inizializza (non verranno azzerati). Questo è giusto per i membri dei membri di Object
e così via in modo ricorsivo.
Object obj{};
è un elenco di inizializzazione o aggregato inizializzazione (se Object
è un aggregato). Quelli chiamati in modo diverso, per parentesi vuote, il comportamento è lo stesso: tutti i membri dei tipi POD sono inizializzati a zero e i non-POD sono inizializzati di default.
Object obj = Object();
teoricamente è una dichiarazione in due fasi: 1) creare temporanea Object
esempio; 2) quindi costruisci obj da copy constructor/move constructor/copy operator/move operator. Ma in pratica sarà costruito di default con in mente copy/move-elision (è abilitato su tutti i moderni compilatori di default anche con tutte le ottimizzazioni disattivate, è necessario disabilitare esplicitamente elision). Meglio non usare questa variante.
Pre-Conclusione
Scegli
Object obj;
o
Object obj{};
Scegli primo luogo se volete l'inizializzazione veloce senza zeroifying suoi POD-soci. Scegli un secondo se vuoi essere sicuro che tutti i suoi membri POD saranno zero dopo l'istanziazione di Object
.
Praticamente, prima del primo che legge dai suoi membri, entrambe le varianti hanno la stessa velocità in runtime su tutti i sistemi operativi moderni.
Quindi ...
Conclusione
Usa valore di inizializzazione:
Object obj{};
a meno che non hai bisogno di una performance in tempo reale su sistemi esotici.
Ok, perché ho un problema quando uso 'Object obj()' ma non ottengo quando uso 'Object obj = Object()'? –
@ghostman bene dovresti usare 'Object obj;', senza parentesi – dabadaba
@juanchopanza ora che ho notato che le parentesi hai ragione, sono diverse. Ho pensato che OP avesse detto 'Object obj', non' Object obj() '. – dabadaba