Bonjour,

J'ai récemment lu cet article et j'ai été surpris par la solution conseillée :

Je comprend l'argument pour mettre les fonctions qui n'ont pas besoin d'accéder aux données privées comme non-membre mais je ne partage pas cet avis dans la plupart des cas.

J'ai l'impression que les avantages de mettre ces fonctions comme étant membre (hors opérateurs binaires) sont :

  1. Si jamais on doit optimiser cette fonction par la suite et accéder aux membres privés, il n'y a rien à changer ni à rajouter friend
  2. Facilité d'utilisation pour les templates
  3. Uniformité de la syntaxe
  4. Ressemblance aux autres langages
  5. Évite d’encombrer les espaces de noms


Et les désavantages cités sont :

  1. Moins d'encapsulation
  2. Temps de compilation plus longs


Maintenant, regardons les contre arguments donnés pour les avantages :

1) Pas de contre argument donné, car possibilité non citée dans l'article (uniquement le cas où on optimise déjà la fonction est évoqué, pas une optimisation future imprévue). On peut toujours utiliser friend cependant.
2) Pas de contre arguments, c'est justement un des cas légitimes selon l'article.
3) Ici l'article dit que la syntaxe ne sera de toute manière pas uniforme : si on a pas accès (en modification) à la classe, on est obligé de rajouter les fonctions comme non-membre (pourquoi ne pas hériter ?)
4) et 5) sont des avantages négligeables

Regardons maintenant les contre arguments pour les désavantages :

1) Et si ces fonctions qu'on implémente comme étant membre n'utilisent que l'interface public de la classe ? Il n'y a donc pas besoin de modifier ces fonctions lors d'un changement interne à la classe...
2) Pas de contre argument, il est vrai que tout mettre dans la classe empêche de dissocier les headers.

Ce qui nous laisse avec :

Pour : Optimisation future sans utilisation de friend, templates, uniformité avec un ajout dans la hiérarchie de classe mais sans rajouter de fonctions virtuelles
Contre : Temps de compilation

Je ne suis donc pas hyper convaincu, pourtant l'auteur en connais beaucoup plus que moi sur le C++ et doit avoir de bonnes raisons. Ais-je oublié quelque chose, y a t-il quelque chose qui est beaucoup plus important qu'il n'y parait ?

De plus, il me semble que la bibliothèque standard propose toutes ses fonctions associées à une classe (les fonctions génériques ne sont pas associées à une classe) comme membre : par exemple, on aurait pu implémenter vector::empty à partir de l'interface publique (vector::size()==0) sans dégrader les performances. Pourtant, empty est membre (bon peut être par uniformité par rapport à list et ainsi permettre l'utilisation de template...). En tout cas, je ne vois pas d'exemple de fonction liée à une classe, non membre, non opérateur binaire. Si vous en avez un, dites-le moi^^

Merci,
NoIdea