Object obj();
n'est pas une instanciation de l'objet, c'est une déclaration d'une fonction obj
qui ne prend pas d'argument et retourne une instance de Object
.
Object obj;
est un default initialization
, c'est à dire l'instanciation implicite avec le constructeur (donc, par défaut implicite du constructeur ou défini par l'utilisateur non-explicit
constructeur sans paramètres), et la présente déclaration des appels implicites constructeurs de non-POD Object
des membres, et pour les POD-types, il n'a pas les initialiser (ils ne seront pas remis à zéro). C'est juste pour les membres de membres de Object
et ainsi de suite récursivement.
Object obj{};
est une liste d'initialisation ou d'agrégation d'initialisation (si Object
est un agrégat). Ceux qu'il appelle différemment, pour vider les accolades, le comportement est le même: tous les membres de POD-types sont initialisé à zéro, et de la non-POD sont par défaut-initialisé.
Object obj = Object();
théoriquement, est un deux-étape de déclaration: 1) créer temporaire Object
de l'instance; 2) construire alors obj par le constructeur de copie/constructeur de déplacement/copie de l'opérateur/déplacer de l'opérateur. Mais dans la pratique, il sera par défaut-construit avec des copier/déplacer-élision à l'esprit (il est activé sur tous les compilateurs modernes par défaut, même avec toutes les optimisations off, vous devez désactiver l'élision de manière explicite). Mieux vaut ne pas utiliser cette variante.
Pré-Conclusion
Choisir
Object obj;
ou
Object obj{};
Choisissez d'abord si vous voulez l'initialisation rapide sans zeroifying ses GOUSSES membres.
Choisissez seconde si vous voulez être sûr que tous ses GOUSSES membres sera de zéro après l'instanciation de l' Object
.
Pratiquement, avant la première lecture de ses membres, les deux variantes ont la même vitesse d'exécution sur tous les Systèmes d'exploitation.
Alors...
Conclusion
L'utilisation de la valeur d'initialisation:
Object obj{};
sauf si vous avez besoin d'une performance temps réel sur les systèmes exotiques.