2017-01-07 3 views
0

Comme mon professeur a enseigné, je l'habitude de mettre en œuvre l'opérateur < < commeopérateur la mise en œuvre << droit

ostream &operator<<(ostream &out, const MyClass &c) 
{ 
    cout << someVariables; 
    return out; 
} 

Mais je me suis rendu, nous obtenons un objet ostream, pourquoi woldn't nous utilisons? Je l'ai essayé et cela a fonctionné:

ostream &operator<<(ostream &out, const MyClass &c) 
{ 
    out << 123; 
    return out; 
} 

que dois-je utiliser? quels sont les avantages de chacun?

+0

La première volonté ** toujours ** à imprimer 'cout' même si vous utilisez un autre cours d'eau. La seconde va imprimer dans le flux fourni. Pensez à quelque chose comme 'aStream << MyClass()'. –

+3

Pourquoi voudriez-vous 'some_stream_that_is_not_cout << some_object' à écrire à' cout'? \ – Peter

+4

L'avantage de la seconde est que, contrairement à la première, il est complètement faux. – molbdnilo

Répondre

-2

Dans le premier exemple, nous définissons la logique à utiliser si un ostream et un MyClass sont des opérandes d'un opérateur <<. Autrement dit, si quelqu'un devait aller

MyClass foo; cout << foo;

Ensuite, il chercherait une surcharge de l'opérateur pour les types de ostream pour Cout, et le type de MyClass. Vous facilement pouvez simplement aller cout << foo.getSomeProperty() à la place, mais si vous l'avez fait dans plus d'un endroit, et que vous vouliez changer la fonctionnalité, puis faire ces changements signifierait changer plusieurs déclarations, plutôt que de simplement faire les changements dans un seul endroit (à savoir où vous définissez la surcharge de l'opérateur).

+0

Le problème est ce qui arrive quand vous écrivez 'ofstream out (" monfichier.txt "); out << foo; ' La première forme de l'opérateur écrira à la console, pas le fichier. –