Pourquoi la surcharge des opérateurs de flux (< <, >>) devrait-elle être conservée en tant qu'amis plutôt que d'en faire des membres de la classe?Surcharge de l'opérateur de flux
Répondre
Lorsque vous surchargez un opérateur binaire en tant que fonction membre d'une classe, la surcharge est utilisée lorsque l'opérande premier est du type classe.
Pour les opérateurs de flux, le premier opérande est le flux et non (habituellement) la classe personnalisée. Pour cette raison, les opérateurs de flux surchargés pour les classes personnalisées qui sont conçues pour être utilisées de manière classique ne peuvent pas être des fonctions membres de la classe personnalisée, elles doivent être des fonctions libres.
(Je suppose que les classes de flux ne sont pas ouvertes pour être changées, si vous pouviez ajouter des fonctions membres à des classes de flux pour gérer des types personnalisés supplémentaires mais cela serait généralement indésirable du point de vue de la dépendance.
Qu'ils soient ou non amis, ils doivent indiquer s'ils doivent accéder aux membres non publics de la classe.
Je pense que c'est un peu trompeur. Ils * peuvent * être des fonctions membres, mais pour les utiliser de la manière habituelle (écrire dans les flux), ils doivent être des fonctions membres. –
@sztomi: Je ne comprends pas votre commentaire. Non, ils ne doivent pas être des fonctions membres; ils ne peuvent pas être des fonctions membres (sauf si vous écrivez une classe de flux ou si vous écrivez vos opérateurs de streaming en arrière du reste du monde). –
Alors oui, ils peuvent être des fonctions membres. Si vous voulez qu'ils fonctionnent comme d'habitude (comme le reste du mot l'utilise), vous devez les définir comme des amis. C'est ce que je voulais dire. –
Membres de quelle classe? Quel est le type de l'opérande de gauche?
Ils ne doivent pas nécessairement être friend
, sauf s'il est nécessaire d'accéder à des données privées inaccessibles autrement.
On peut donc dire:
some_stream << my_class;
Notez que la définition des opérateurs membres rend le côté gauche de la self classe elle. par exemple:
my_class << some_stream;
Ce qui n'est pas la manière dont les flux standards sont supposés fonctionner.
- 1. surcharge flux en C++
- 2. la surcharge de l'opérateur d'insertion flux
- 3. surcharge de l'opérateur d'extraction de flux en C++ help
- 4. surcharge de surcharge, débordement récursive
- 5. opérateur de surcharge nouveau sans opérateur de surcharge supprimer
- 6. surcharge de l'opérateur C++
- 7. surcharge __init__ de unittest.TestCase
- 8. Surcharge de l'opérateur C++
- 9. binaire de surcharge +
- 10. Symfony: Aides de surcharge?
- 11. problème de surcharge d'opérateur
- 12. Résolution de surcharge C#?
- 13. Meilleures pratiques de surcharge
- 14. surcharge de l'opérateur
- 15. Surcharge de l'opérateur d'événement + =
- 16. Surcharge de construction WebClient
- 17. Méthodes d'association de surcharge
- 18. F #: fonctions de surcharge
- 19. surcharge de l'opérateur C++
- 20. C# Surcharge de l'opérateur
- 21. opérateur de déréférencement de surcharge
- 22. Flux personnalisé/streambuf utilisant Ogre3d avec des erreurs de surcharge ambiguës
- 23. le flux C de comme paramètre lorsque l'opérateur surcharge <<
- 24. Flux d'entrée C++ n'attendant pas d'entrée avec surcharge de l'opérateur d'extraction
- 25. C++ Surcharge de l'opérateur >>
- 26. Problème de surcharge MVC Html.TextArea
- 27. Surcharge jQuery Méthode de dialogue
- 28. "surcharge de méthode" en javascript
- 29. problème override/surcharge C de
- 30. Surcharge de l'opérateur >>
Cela rend la programmation tellement plus excitante lorsque les fonctions ont une liaison avec les membres privés de vos classes. – zneak