0
votes

que signifie l'opérateur et le type de retour?

Donc, d'après ma connaissance,

istream& operator >> (istream &in, int &n);

est la déclaration pour savoir comment >> fonctionne (ou pour la surcharger d'une certaine manière)

Mais je suis confus à ce sujet type de retour "function", "istream &".

Si je fais quelque chose comme cin >> x; cela signifie que je mets la référence à x, mais je ne comprends pas le type de retour istream &, et le paramètre "in".

À quoi ressemblerait cette fonction définie? Ce qui est en"? Et qu'est-ce que ça revient réellement? Parce que cin >> x fait vraiment autre chose que prendre une entrée, alors pourquoi doit-il renvoyer quelque chose?

Merci!


20 commentaires

c'est une référence à un istream . - et istream & operator >> (istream & in, int & n); signifie que n sera modifié - par opposition à const & n


Renvoyer une référence au flux est ce qui permet des constructions comme cin >> x >> y


Il n'y a pas de " & opérateur " comme votre titre l'indique. Le nom de la fonction est operator >> (deux jetons) et & est un jeton indépendant utilisé pour indiquer un type de référence. Donc & operator n'est pas une chose.


@curiousguy Bien repéré - je l'ai changé


@TedLyngmo Je ne vois aucun opérateur d'adresse dans votre code.


@curiousguy J'ai seulement changé & operator en operator & - C'était mon "aha" à votre commentaire. - dans OP: s question.


@TedLyngmo Il n'y a pas de opérateur & , mais operator>>


@curiousguy La question était: "Que signifie le type de retour de l'opérateur &?" - Je l'ai seulement changé en "Que signifie le type d'opérateur et de retour?" - et je l'ai fait en réaction à votre commentaire. Peut-être pas la bonne raison, mais toujours ok je pense.


@TedLyngmo Le code a istream & operator >> qui peut être écrit avec les caractères & operator ensemble car de toute façon il s'agit de deux jetons séparés. Le PO doit préciser s’il existe une adresse d’opérateur!


Nous ne parlons pas de la même chose. J'ai changé le sujet auquel vous vous opposiez. C'est tout.


@curiousguy - sommes-nous réglés ou y a-t-il encore une idée fausse sur le sujet de ma correction de la question?


@TedLyngmo Le titre no a au moins un sens en lui-même, car operator & est une chose différente de & operator , mais il peut ne pas refléter l'intention de l'OP; J'ai deviné qu'il avait écrit & operator dans le titre car ces deux jetons apparaissent ensemble dans son code. Il a peut-être voulu dire quelque chose comme & operator >> (...) .


Oh, si j'ai changé l'intention de OP: s - je m'excuse. Je n'ai pas reçu ce commentaire d'OP plus tôt.


@curiousguy Êtes-vous d'accord avec ma modification si OP l'est?


@TedLyngmo Si c'était la question de l'OP, je suis d'accord avec votre modification, mais je pense que l'OP est confus au sujet de la syntaxe. C'est au tour de l'OP de répondre maintenant!


Hé les gars, pour être honnête, je suis assez nouveau dans le C ++, donc je n'ai pas suivi toute cette interaction, mais ma question concernait simplement le type de ce que cette "fonction" renvoyait, je ne comprenais pas comment cela la surcharge des opérateurs a fonctionné dans son ensemble, sans trop se concentrer sur la «référence» et où elle va. J'étais plus inquiet de ce que la fonction faisait et regardait dehors. Merci! @curiousguy


@TedLyngmo ^^, idk pourquoi je ne peux pas vous informer tous les deux


@ming Vous devez apprendre à déchiffrer le principe C / C ++ surprenant mais cohérent en interne de la déclaration de choses (variables ou fonctions). C'est ce qu'on appelle un déclarateur : & operator >> (istream & in, int & n) . Voir, le & en fait partie, mais pas le nom de la fonction qui est juste opérateur >> . Il lit: appeler operator >> avec une lvalue modifiable de istream et l'une de int retourne formellement une référence, c'est-à-dire donne une lvalue. Une lvalue est une expression qui fait référence à un objet identifié.


Ouais, notre professeur a mentionné les valeurs mais ne les a pas vraiment abordées, donc ça me déroute un peu. La référence & signifie-t-elle pas? Donc "operator >>" est le nom de la fonction et "istream &" est le type de retour alors? Dans ce cas, je ne comprends pas vraiment et ici. Et quand vous dites qu'une lvalue est une expression qui fait référence à un objet identifié, cela signifie simplement que sur la gauche, il y a fondamentalement autre chose que le côté droit du "=" doit avoir une adresse? C'est un peu ce que j'ai retenu de la classe. @Curiousguy


@ming Si vous connaissez lvalues, vous ne pouvez pas comprendre la signification et le but des références. Le & déclare une référence, l'utilisation d'une fonction "renvoyer une référence" est une lvalue. C'est comme si la fonction retournait le "nom" ou la désignation d'un objet.


3 Réponses :


0
votes

Cela signifie que c'est un pass-thru dans ce cas particulier (et bien d'autres). C'est un contrat pour retourner quelque chose de sensé avec l'entrée donnée. Renvoyer is est la chose sensée car cela crée des constructions comme:

flux >> variableA >> variableB >> variableC

possible. En effet, stream >> variableA renvoie stream , tout comme les autres opérations.


3 commentaires

Ohhh c'est vrai, j'ai oublié qu'il y avait différents flux de sortie, donc "stream" comme dans votre exemple serait comme "cout" ou "outfile" non? Et cela signifie-t-il que techniquement, si nous passons en cin, nous pouvons revenir en tenue? Et disons que nous doublons chaque entier n que nous transmettons. Alors, comment ce nouveau n est-il également renvoyé si la seule chose que nous renvoyons est un flux de sortie? Comme si nous mettons des paramètres, ce que nous obtenons en retour est juste le flux que nous mettons (ex. Cin) ou un nouveau flux (outfile)


@ming Much so - c'est un langage très ouvert, mais très pointilleux avec ce qu'il accepte :-)


@ming L'implémentation canonique de tous les opérateurs de lecture / écriture (op << op >>) est return lhs; (pour un non membre) ou return * this; (pour un membre)



0
votes

Si la fonction,

a << b << "Yo!" << c << "Wassup?" << endl;

renvoie, à la place,

istream operator >>....

Alors, les choses se compliquent. Dans le pire des cas, chaque invocation de >> copierait l'objet de flux et retournerait la copie, qui serait ensuite copiée et stockée dans la pile de l'appelant, suivie d'appels aux destructeurs de toutes ces choses qui ont été copiés, sauf circonstances spéciales.

En renvoyant une référence, nous pouvons faire des choses comme le chaînage:

istream& operator >> (istream &in, int &n);

... sans toutes ces absurdités .

& signifie «référence», qui est essentiellement un pointeur avec une vérification plus forte à la compilation et une meilleure syntaxe.


2 commentaires

En interne, il est implémenté en tant que ptr, mais pour la syntaxe et le POV sémantique, ce n'est pas le cas. L'expression utilisant une référence fait référence à l'objet et non à son adresse.


OK ... Mon précédent commentaire non relu a été supprimé dans la honte, veuillez faire de même.



2
votes

L'implémentation standard de operator >> renverrait une référence au paramètre istream & in, ce qui signifie qu'il renvoie exactement le même objet.

Ceci est pour plus de commodité afin que vous puissiez écrire du code comme: cin >> x >> y;

Le compilateur prendra ce qui se trouve sur le côté gauche de l'opérateur et insérera le premier paramètre et la droite dans le deuxième . cin >> x >> y se traduira par opérateur >> ((opérateur >> (cin, x), y);

Cela ajoutera d'abord x au flux et utilisera le retour, le flux lui-même, et y écrira y.


0 commentaires