web-dev-qa-db-fra.com

Variables membres C++

Considérez la classe suivante:

class A
{
  A();
  int number;
  void setNumber(int number);
};

Vous pouvez implémenter 'setNumber' de 3 manières:

Méthode 1 : Utilisez le pointeur 'this'.

void A::setNumber(int number)
{
  this->number = number;
}

Méthode 2 : Utilisez l'opérateur de résolution de l'oscilloscope.

void A::setNumber(int number)
{
  A::number = number;
}

Méthode 3 : Indiquez plutôt toutes les variables membres avec 'm' ou '_' (méthode préférée).

void A::setNumber(int number)
{
  mNumber = number;
}

S'agit-il d'une préférence personnelle ou le choix d'une méthode particulière présente-t-il un avantage?

15
Julian

C’est surtout une préférence personnelle, mais permettez-moi de partager mon point de vue sur la question depuis une entreprise où de nombreux petits jeux sont créés simultanément (et donc de nombreux styles de codage sont utilisés autour de moi).

Ce lien a plusieurs bonnes réponses liées: Pourquoi utiliser des préfixes sur les variables membres dans les classes C++

Votre option 1:

void A::setNumber(int number)
{
  this->number = number;
}

Tout d'abord, de nombreux programmeurs ont tendance à trouver cela fastidieux, à taper continuellement le 'this->'. Deuxièmement, et plus important encore, si l’une de vos variables partage un nom avec un paramètre ou une variable locale, un objet find-replace conçu pour indiquer que le nom de 'nombre' peut être modifié peut affecter les variables membres situées dans l’étendue find-replace. bien.

Votre option 2:

void A::setNumber(int number)
{
  A::number = number;
}

Le problème que j'ai rencontré avec ceci est que dans les grandes classes, ou les classes avec de grandes fonctions (où vous ne pouvez pas voir la fonction ou la classe est nommée de manière inattendue), la mise en forme de A: :( chose) ressemble beaucoup à l'accès une partie d'un espace de noms, et peut donc être trompeuse. L’autre problème est identique au n ° 2 de l’option précédente. Si vos noms sont similaires à des variables que vous utilisez, il peut parfois y avoir une confusion inattendue.

Votre option 3:

void A::setNumber(int number) 
{
  mNumber = number;
}

C'est la meilleure des trois options présentées. En créant (et en maintenant!) Une syntaxe qui implique un préfixe clair et significatif, vous créez non seulement un nom unique qu’une variable locale (ou globale) ne partagera pas, mais vous préciserez immédiatement où cette variable est déclarée, quel que soit le contexte dans lequel vous le trouvez. Je l'ai vu faire à la fois comme ceci 'mVariable' et comme ceci 'm_variable' et cela dépend surtout du fait que vous préfériez les traits de soulignement à la concaténation majuscule. En outre, si votre style a tendance à ajouter des éléments tels que "p" pour les pointeurs ou "g" pour les globals, ce style conviendra bien et sera attendu des lecteurs.

13
Kerr

C'est une question de style, donc de préférence personnelle, ou une préférence de l'équipe avec laquelle vous travaillez ou du chef de l'équipe avec laquelle vous travaillez.

7
user405725

Option 4 :

void A::setNumber(int n)
{
  number = n;
}

Pourquoi l'avantage d'utiliser le même nom pour un membre et un paramètre. Rien de bon ne peut en résulter. C’est clair, c’est clair maintenant, mais lorsque vos méthodes prennent de l'ampleur et que le prototype ne rentre plus dans l'écran, et qu'un autre développeur écrit du code, il peut oublier de qualifier le membre.

5
Luchian Grigore

Je dirais que le choix entre la méthode 1 et la méthode 3 est une question de style personnel ou organisationnel.

La méthode 2 est inférieure, car Class :: member désigne généralement une variable de membre statique et pourrait donc créer une confusion en cas d'utilisation de la ambiguïté entre un paramètre et une variable de membre.

2
JohnMcG

sa toute préférence personnelle 

mais voici une bonne discussion à ce sujet à un niveau élevé non linguistique

https://stackoverflow.com/questions/381098/what-naming-convention-do-you-use-for-member-variables

2
nate_weldon

Je vais être d'accord avec Luchian en fournissant une meilleure variante. Les autres exemples que vous fournissez sont trop lourds ou déroutants.

Option 4 :

void A::setNumber(int aNumber)
{
  theNumber = aNumber;
}

Cela fait partie de la norme de codage que nous utilisons chez mon employeur et ce que vous décrivez est très clair. Ce n'est pas une notation hongroise.

0
user195488