IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Question sur la surcharge de l'opérateur <<


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Question sur la surcharge de l'opérateur <<
    bonjour à tous;

    j'ai un soucis au niveau de la surcharge des opérateurs <<

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ostream& operator<<(ostream& flux,Duree duree1)
    ma question est:
    1) pourquoi utiliser une référence au niveau du type de retour?
    2) nous pouvons utiliser cout au niveau de flux c'est-à-dire dans la signature de la fonction?

    merci d'avance!!

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut, et bienvenue sur le forum.

    1) la réponse simple : parce que c'est comme cela

    La réponse longue:
    Lorsque l'on transmet une donnée quelconque par valeur (donc, sans utiliser les références ou les pointeurs), il y a forcément création d'une copie de la donnée en question.

    On peut facilement s'en rendre compte avec un code aussi simple que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void add_two(int value){
        value +=2;
        std::cout<<"dans add_two, value = " << value<<"\n";
    }
    int main(){
        int value{5};
        std::cout<<"Avant add_two, value = " <<value<<"\n";
        add_two(value);
        std::cout<<" Apres add_two, value = "<<value<<"\n";
        return 0;
    }
    qui, une fois compilé et exécuté va provoquer l'affichage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Avant add_two, value = 5
    dans add_twoo, value = 7
    Apres add_two, value = 5
    Ce code nous permet de nous rendre compte que bien que la donnée utilisée dans la fonction main s'appelle value et que la donnée de la fonction foo s'appelle aussi value, il s'agit en réalité de deux données tout à fait différentes. Il y a eu copie de la donnée nommée value dans la fonction main lorsque la fonction foo a été appelée.

    Quand on transmet une donnée par référence, on crée en réalité un alias de la donnée transmise au niveau de la fonction appelée.

    C'est à dire que, au pire, la donnée sera connue sous un autre nom dans la fonction appelée, mais ce sera basiquement la même donnée qui sera manipulée dans les deux fonctions. C'est à dire que toutes les manipulations que pourra subir la donnée au niveau de la fonction appelées seront ... répercutées sur la donnée de la fonction appelante.

    Si nous modifions un tout petit peu le code précédant pour lui donner la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void add_two(int & data){
        data +=2;
        std::cout<<"dans add_two, data = " << data<<"\n";
    }
    int main(){
        int value{5};
        std::cout<<"Avant add_two, value = " <<value<<"\n";
        add_two(value);
        std::cout<<" Apres add_two, value = "<<value<<"\n";
        return 0;
    }
    après compilation, son exécution provoquera l'affichage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Avant add_two, value = 5
    dans add_twoo, data= 7
    Apres add_two, value = 7
    On remarque donc que, bien que la donnée ne porte plus le même nom dans les deux fonctions (elle s'appelle value dans la fonction main et data dans la fonction foo), c'est, malgré tout la même donnée qui est manipulée, et toutes les modifications subies par la donnée dans la fonction appelée (foo) sont répercutées sur la donnée au niveau de la fonction appelante (main).

    Il en va, grosso modo, de même pour les valeurs de retour (avec quelque particularités dont je ne parlerai pas tout de suite ).

    Ce qu'il y a d'intéressant, lorsque tu renvoie par référence une référence reçue comme paramètre, c'est que cela te permet de "chaîner les appels".

    Tu auras remarqué que le code que j'ai écrit prend la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout<<"une chaine de caractères fixe" << une_variable <<"une autre chaine de caractères fixe";
    Ce code aura exactement le même résultat que si j'avais écrit un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::cout<<"une chaine de caractères fixe";
    std::cout<<une_variable;
    std::cout<<"une autre chaine de caractères fixe";
    Mais il est beaucoup plus facile de le faire sous la première forme que sous la deuxième, parce que le code est "plus compacte" et que j'ai moins de caractères à écrire au final.

    En outre, si tu a un éditeur de textes correct, il affichera les différents éléments avec des couleurs différentes, ce qui te permettra de te rendre compte qu'il y a bel et bien plusieurs éléments distincts. Il n'y aura donc aucun impact sur la facilité avec laquelle "quelqu'un d'autre" pourra comprendre le code. Tous bénef

    Enfin, il faut savoir que la classe std::ostream ne peut pas être copiée. Ce qui est normal, car, vu qu'elle intervient dans une hiérarchie de classes, elle a forcément sémantique d'entité (mais cette notion est sans doute très loin de ton niveau actuel ... nous en reparlerons plus tard en cas de besoin ).

    Contentons nous donc dans un premier temps de savoir que, si tu essayais de créer une copie d'une donnée de type std::ofstream (de std::cout, par exemple), le compilateur ne serait vraiment pas content et t'enverrait bouler; ce qui justifie ma réponse courte .
    (2) Non, parce que std::cout est le nom d'une variable globale, comme std::cin, alors que la signature de fonction doit connaitre le type des données, aussi bien pour ce qui concerne les paramètres attendus que pour ce qui concerne le ... type de retour de la fonction

    NOTA: pourrais tu changer le titre de la discussion, par exemple sous la forme "problème d'opérateur", pour qu'il décrive un peu mieux ton problème car " adda issa abdoul razak", ca ne me disait absolument rien

Discussions similaires

  1. Question sur la surcharge de constructeur avec enum ?
    Par LiTiL_DiViL dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 05/04/2013, 12h53
  2. question sur la surcharge d'opérateur ++
    Par deubelte dans le forum Débuter
    Réponses: 13
    Dernier message: 26/04/2010, 18h28
  3. Question sur la surcharge buffer
    Par sivaller dans le forum OpenGL
    Réponses: 1
    Dernier message: 04/04/2008, 00h02
  4. [debutant] question sur la surcharge des operateurs
    Par hunter99 dans le forum Débuter
    Réponses: 17
    Dernier message: 04/01/2008, 18h26
  5. question sur les opérateurs
    Par isidore dans le forum C++
    Réponses: 10
    Dernier message: 25/02/2005, 18h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo