Listes d'initialisation dans les constructeurs : noms superposés avec des variables membres
La pratique consistant à initialiser les variables membres en utilisant les mêmes noms que les arguments du constructeur a soulevé des questions sur sa validité et sa conformité aux normes C. Explorons le point de vue de la norme sur cette pratique.
Selon la norme C, §12.6.2/7, les expressions de la liste d'expressions d'un initialiseur de membre sont évaluées dans la portée du constructeur. Par conséquent, l'utilisation du même nom pour un argument constructeur et une variable membre est explicitement autorisée.
Par exemple, l'extrait de code suivant est entièrement conforme à la norme C :
class Blah { std::vector<int> vec; public: Blah(std::vector<int> vec): vec(vec) {} // ... };
Dans dans ce cas, l'argument constructeur vec est utilisé pour initialiser la variable membre vec sans aucune ambiguïté.
De plus, la norme autorise l'utilisation du pointeur this dans initialiseurs de membres pour faire référence à l’objet en cours d’initialisation. Cela permet l'initialisation de variables membres en fonction d'autres variables membres, comme le montre l'exemple suivant :
class X { int a; int b; int i; int j; public: X(int i): r(a), b(i), i(i), j(this->i) {} // ... };
Cependant, il convient de noter que passer le paramètre constructeur comme référence const peut améliorer l'efficacité du code en évitant copie inutile de l'objet vectoriel d'origine. Ceci peut être réalisé en modifiant le constructeur comme suit :
Blah(const std::vector<int> &vec): vec(vec) {}
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!