9
votes

C ++: Listes d'initialisation / Conventions de dénomination

Le code suivant fonctionne sur ma machine, mais est-ce une bonne pratique / garantie de fonctionner? XXX

Spécialement, est X (X) garanti de faire ce que je veux? (C'est-à-dire que la variable dans une liste d'initialisation examine-t-elle toujours ce membre de la structure / de la classe?)

Je ne veux pas utiliser les traits de soulignement principal ou traînant depuis X est un membre public de la structure.

merci!


4 commentaires

Pendant que le compilateur fait la bonne chose, tout humain en regardant le code sera déconcerté. Et si ce type est plus complexe que ce que vous montrez et que vous ajoutez une décennie et trois générations de programmation de maintenance à cela, cela se retrouvera presque certainement comme un gâchis.


Que recommanderiez-vous à faire à la place?


@SBI Recommandations?


@ Cătălinasîrbu: C'est presque une décennie. J'ai changé d'idée depuis. : - /


3 Réponses :


13
votes

Oui, c'est garanti de faire ce que vous attendez.

La seule chose qui peut exister "en dehors" les parenthèses d'une liste d'initialistes sont des variables de membre. Et à l'intérieur des parenthèses, les règles habituelles s'appliquent; Variables locales Masquer les variables des membres.

Quant à savoir si c'est une bonne pratique, bien, considérez ce qui se passe si vous supprimez accidentellement un ou plusieurs des arguments de la liste des arguments du constructeur. Le code va toujours compilera bien! Mais cela va briser horriblement au moment de l'exécution. Néanmoins, j'utilise toujours ce modèle assez fréquemment.


1 commentaires

Le code compilera toujours bien! J'ai essayé cela et je ne comprends pas pourquoi. Vous avez dit qu'en dehors des parenthèses, il y a des variables membres. Si un supprimer l'argument de ma liste de constructeurs, la variable locale n'existe plus. Cela signifie-t-il que muntructeur (int x, int y): x (x), y (y), z (z) {} fera quoi sur le membre z ?



0
votes

oui, x (x) fait exactement ce que vous voulez. x (x) est un nom du membre, et x ( x ) est un argument formel.


0 commentaires

2
votes

Bien que cela s'attend à ce que vous faites, imaginez cette situation par extension: xxx

qui ne fonctionnera pas. C'est pourquoi je préfixcule mes membres de la classe avec m _ . Cela permet un code très lisible avec un indice au lecteur que l'identifiant en question fait partie de la classe. Les identificateurs non préfixés sont les arguments de fonction (comme dans la liste Initializer constructeur: m_x (x) ou fonction variables locales).


0 commentaires