Surcharge d'opérateur : fonction membre vs fonction non membre
Dans la surcharge d'opérateur, le choix entre les fonctions membres et non membres prête à confusion . Alors que les fonctions membres sont asymétriques et les fonctions non membres sont symétriques, pourquoi les amis sont-ils préférés dans certains scénarios ?
Les fonctions membres ne peuvent accepter qu'un seul paramètre explicite, car le pointeur this est automatiquement transmis pour représenter l'objet appelant. Cette asymétrie limite la comparaison aux situations où la fonction membre est invoquée sur l'opérande de gauche. Cependant, cette approche échoue lorsque l'opérande de gauche n'est pas un type de classe, comme lorsque l'on tente de comparer un double à un objet Sample.
Pour remédier à cette limitation, les fonctions amies peuvent être utilisées pour surcharger les opérateurs. Les fonctions amies ont accès aux membres privés de la classe, ce qui leur permet de gérer la surcharge des opérateurs sans la restriction d'asymétrie. Le compilateur traduit une expression telle que 10.0 s2 en opérateur (10.0, s2) lorsqu'une fonction ami est utilisée.
Les algorithmes STL préfèrent les versions symétriques car ils permettent des comparaisons dans les deux sens, supprimant ainsi le besoin d'un ordre explicite dans les opérandes. . Cependant, les fonctions non membres doivent être utilisées lorsque cela est possible pour améliorer l'encapsulation, car les fonctions amies permettent l'accès aux membres privés.
En résumé, les fonctions membres sont utilisées pour les opérateurs où l'instance de classe est toujours impliquée en tant qu'opérande de gauche. , tandis que les fonctions amies gèrent les situations dans lesquelles l'instance de classe peut être l'un ou l'autre des opérandes. Pour plus de flexibilité et d'encapsulation, les fonctions non membres doivent être privilégiées lorsqu'elles n'accèdent pas aux membres privés.
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!