41 votes

Quelle est la différence entre l'Objet obj = Object() et de l'Objet obj()?

Je pense qu'il a beaucoup d'information à ce sujet mais je ne sais pas comment cela s'appelle. Je ne comprends pas la différence entre les deux chaînes de code:

Object obj();

Et

Object obj = Object();

Pouvez-vous expliquer? Ou au moins dire comment l'appeler.

50voto

vladon Points 98
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.

31voto

aschepler Points 23731
Object obj();

déclare une fonction, pas un objet! C'est une instance de "la Plus Délicate à Analyser".

Object obj = Object();

exige Object de un accessible constructeur de déplacement ou de constructeur de copie (bien que le compilateur pourrait eliding le déplacer/copier).

Des moyens simples pour créer un objet inclure:

Object obj;
Object obj{};

21voto

NathanOliver Points 10062
Object obj();

Déclare une fonction noms obj qui renvoie un Object et ne prend pas de paramètres. Ce n'est généralement pas ce que vous voulez.

Object obj = Object();

Déclare une Object nommée obj alors la copie est initialisé avec une temporaire par défaut construits Object. Normalement, vous ne voulez pas le faire, sauf si vous êtes à la réinitialisation d'un objet à l'état par défaut.

En général, si vous voulez construire sans faire appel à un constructeur, vous pouvez utiliser

Object obj;
//or
Object obj{};

8voto

Bathsheba Points 23209

Grande différence.

Le premier est un prototype de fonction à une fonction prenant aucun argument et renvoyant un Objet.

Le second instancie un Objet en appelant le constructeur par défaut. Pour éviter tout doute, l'opérateur d'affectation n'est pas appelé.

Déposer les parenthèses dans le premier cas, de faire les déclarations équivalent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X