2010-07-23 4 views
6

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

+3

Cela rend la programmation tellement plus excitante lorsque les fonctions ont une liaison avec les membres privés de vos classes. – zneak

Répondre

9

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.

+0

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. –

+0

@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). –

+0

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. –

0

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.

2

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.