Maison >développement back-end >C++ >Les noms d'arguments du constructeur et de variables membres sont-ils autorisés à se chevaucher en C ?

Les noms d'arguments du constructeur et de variables membres sont-ils autorisés à se chevaucher en C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-12 21:49:01562parcourir

Are Constructor Argument and Member Variable Names Allowed to Overlap in C  ?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn