37 votes

int a = 0 et int a (0) différences

Double Possible:
Est-il une différence en C++ entre copie d'initialisation et directe de l'initialisation?

J'ai juste commencé à apprendre le C++.

Pour initialiser une variable avec une valeur, je suis tombé sur

int a = 0;

et

int a(0);

Cela me confond beaucoup de choses. Pourrais-je savoir qui est le meilleur moyen?

57voto

SeeJay Points 396

int a = 0; et int a(0); ne font aucune différence dans le code généré par la machine. Ce sont les mêmes.

Voici le code d'assemblage généré dans Visual Studio.

 int a = 10;   // mov dword ptr [a],0Ah  
int b(10);    // mov dword ptr [b],0Ah  
 

22voto

Luchian Grigore Points 136646

Ils sont tous les deux identiques, il n'y a donc vraiment pas de "meilleur moyen" .

J'utilise personnellement

 int a = 0;
 

parce que je le trouve plus clair et que son utilisation est plus répandue dans la pratique.

Ceci s'applique à votre code, où le type est int . Pour les types de classe, le premier est l’initialisation par copie, tandis que le second est l’initialisation directe; dans ce cas, cela ferait une différence .

5voto

AndreyT Points 139512

Il n'y a pas de "meilleure" façon. Pour les types scalaires (comme int dans votre exemple), les deux formes ont exactement le même effet.

L' int a(0) de la syntaxe pour les non-types de classe a été introduit pour prendre en charge uniforme direct syntaxe d'initialisation de la classe et de la non-types de classe, ce qui est très utile dans de type indépendant (modèle) du code.

Non code du modèle de l' int a(0) n'est pas nécessaire. Il est complètement à vous de décider si vous souhaitez utiliser l' int a(0) de la syntaxe, ou préfèrent s'en tenir aux plus traditionnels int a = 0 de la syntaxe. Les deux font la même chose. Ce dernier est plus lisible, à mon avis.

5voto

Barnabas Szabolcs Points 4109

À partir d'un point de vue pratique: je voudrais seulement utiliser int a = 0;.

L' int a(0) peut être autorisé, mais jamais utilisé dans la pratique en elle-même.


Je pense qu'il ne devrait pas vous déranger sur votre niveau, mais nous allons aller plus loin.

Disons qu' a est une classe, pas un int.

class Demo{
public:
  Demo(){}; 
  Demo(int){};
};
Demo a;
Demo b(a);   
Demo c = a;  // clearly expressing copy-init

Dans cet exemple, les deux b(a) et c=a faire de même, et je voudrais vous décourager à l'aide de la première solution. Ma raison est, qui est similaire c(2) qui est une construction à partir d'arguments.

Il y a seulement deux utilisations valides de ce support de style de l'initialisation:

  • initialisation des listes (Demo(int i):data(i){} si la Démo a un int membre de données data),
  • la nouvelle est: Demo *p=new Demo(a); // copy constructing a pointer

2voto

RaJeSh Points 156

C'est aussi simple que cela. (Enfin, presque - il y a quelques choses que vous ne pouvez pas le nom de vos variables, dont nous parlerons dans la prochaine section)

Vous pouvez également assigner des valeurs aux variables lors de la déclaration. Lorsque nous affecter des valeurs à une variable en utilisant l'opérateur d'affectation (signe égal), cela s'appelle une affectation explicite:

int a= 5; // explicit assignment

Vous pouvez également affecter des valeurs à des variables à l'aide d'une affectation implicite:

int a(5); // implicit assignment

Même si implicite affectations ressemblent beaucoup à des appels de fonction, le compilateur effectue le suivi des noms de variables qui sont et qui sont les fonctions de sorte qu'ils peuvent être résolus correctement.

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