2011-11-22 4 views

Répondre

7

Non, ce n'est pas grave. Les deux entraîneront un appel au même constructeur.

+2

ne pas le deuxième appel le constructeur de copie? –

+3

@Paul: Il peut, mais la plupart des compilateurs ne le seront pas avec les optimisations activées (voir aussi 'copy elision'). C'est fondamentalement une différence entre _direct-initialization_ et _copy-initialization_. – ildjarn

+1

@ildjarn Le fait que les compilateurs 'fixent' le problème avec le code est en dehors du point. Sans optimisation, la deuxième version pourrait être deux fois plus lente que la première et certainement pas C++ ish. :) –

4

Vous devriez le faire de la première façon parce que si vous le faites de la deuxième façon, je crois que le compilateur fait quelque chose de plus compliqué que nécessaire. Je pense qu'il crée un objet temporaire pour représenter le côté droit, puis utilise le constructeur de copie pour copier des valeurs dans l'objet sur le côté gauche. Je peux me tromper à ce sujet, alors vérifiez votre liste d'assemblage.

+0

Je crois que le compilateur appellera le constructeur de copie en utilisant l'objet temporaire, par opposition à l'appel de l'opérateur d'affectation. Je pense que la différence en termes de performance ne serait que le coût de la création de l'objet temporaire que je pense serait insignifiant dans la plupart des cas. – Nerdtron

+0

Merci, j'ai édité ma réponse, en changeant "= operator" en "copy constructor". –

+0

En mode non optimisé, il y aura probablement un appel copy-ctor. En mode optimisé, probablement pas. – Macke

2

Le premier appelle le constructeur tandis que le second appelle le constructeur puis le copie à point. Ainsi, vous devriez utiliser le premier parce qu'il n'initie pas une opération de copie.

2

Oui, c'est important. La première version, Point2D point(1,2), appellera le constructeur, tandis que la seconde, Point2D point = Point2D(1,2) créera d'abord un nouveau Point2D (celui de droite), puis appellera le constructeur de copie pour créer réellement point. Comme vous pouvez le voir, c'est une grande différence entre C++ et Java ou C#.

2

La plupart de l'optimisation de retour valeur temps fera ces deux options assez similaires du point de vue de la performance (surtout si vous avez un opérateur mouvement affectation définie)

Il y a d'autres choses à considérer cependant.

Si votre type a un constructeur vide, ce faisant est problématique:

Point2D p(); // instead of Point p; 

Ceci est connu comme le Most Vexing Parse. Il peut être évité en utilisant la deuxième forme:

Point2D p = Point2D(); 

Ou en utilisant la syntaxe d'initialisation uniforme introduite dans la dernière norme:

Point2D p{}; 
Questions connexes