2017-05-03 1 views
0

// using namespace std;pourquoi retourner la référence à l'objet ostream dans la fonction membre pour la sérialisation

Voici le morceau de code suivant

ostream& write(ostream& os) const { 
    os << getRe() << "j " << getIm(); 
    return os; 
} 

Cette fonction est membre d'une classe représentant des nombres complexes (« PComplex), qui est dérivé d'une classe abstraite (» Serializable »). (Mise en œuvre de pur fonction virtuelle).

Ma question principale est de savoir pourquoi nous avons besoin de retourner une référence à un objet ostream? Pourquoi ne pas vide?

Répondre

1

de retour un objet ostream& nous permet d'enchaîner un groupe d'opérateurs togeather.

Tenir compte de cette déclaration

cout << "Hello " << "World"; 

Ceci est en fait deux appels à ostream& operator<<(ostream& os, const char* c). Si l'on considère l'ordre d'exécution, nous obtenons:

(cout << "Hello ") << "World"; 

Cette fonction accepte cout à gauche et à droite "Hello ". Il imprime le contenu de la main droite à la console, puis il renvoiecout. Nous nous considérons ce qui reste après la première étape, nous obtenons ceci:

(cout) << "World"; 

Maintenant, nous prenons les crochets et obtenir loin:

cout << "World; 

Celui-ci est beaucoup plus facile à traiter. Maintenant, nous appelons à nouveau la fonction pour imprimer `` World '' et renvoyer le cout, que nous ne ferons tout simplement pas avec.


Si nous sommes retournés void au lieu de ostream&, puis (cout << "Hello ") réduirait à (void). Cela nous laisserait avec:

(void) << "World"; 

Ceci ne correspond à aucune surcharge et donc nous aurions alors une erreur. Alors que le (cout << "Hello ") fonctionnerait toujours, nous ne serions pas en mesure d'enchaîner << "World" sur la même ligne.