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
Libérer: 2024-11-12 21:49:01
original
568 Les gens l'ont consulté

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) {}

  // ...
};
Copier après la connexion

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) {}

  // ...
};
Copier après la connexion

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) {}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal