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?
Réponses
Trop de publicités?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 .
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.
À 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éesdata
), - la nouvelle est:
Demo *p=new Demo(a); // copy constructing a pointer
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.