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 :

Fonctionnement de cout<< et cin >>


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2006
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 1
    Par défaut Fonctionnement de cout<< et cin >>
    Comment les fonction Standards C++ comme (cout<<, cin>>,...) accédent aux attributs private d'une classe utilisateurs ??

  2. #2
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    cout n'accède à rien du tout. Depuis une portée donnée, on va lui injecter une variable. Si la variable est visible depuis la portée donnée, ben ça passe. Exactement comme avec n'importe quelle autre fonction.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    cin et cout ne sont, en fait "que" des "gestionnaires de flux"...

    C'est à dire que cin va "se contenter" de capturer des informations dans le flux d'entrée standard (typiquement, mais pas obligatoirement, ce qui est envoyé par le clavier) et d'"injecter" ces informations où on le lui demande, et cout va "se contenter" de prendre les informations qu'on lui donne et de les injecter dans le flux de sortie standard (typiquement, mais pas obligatoirement l'écran)

    Ces "gestionnaires de flux" utilisent des "opérateurs de flux" (les fameux << et >>, selon que ce soit pour cout ou pour cin) pour travailler...

    Les opérateur de flux sont dés le départ prévus pour fonctionner avec les types de base (char, int, long, double) et avec certains type de la bibliotheque standard (les string, par exemple).

    N'oublie pas qu'un opérateur, ce n'est, en définitive, qu'une fonction un peu spéciale, que tu peux décider de surcharger à ta guise... << et >> ne font pas exception.

    Alors, si tu as une classe du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class A
    {
        public:
            // ce qui va bien en public
        protected: 
            //ce qui va bien en protected
        private:
            int num;
            std::string chaine;
    };
    Dans se cas de figure, le compilateur refusera un code du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    A obja;
    //gestion de obja
    std::cout<<obja.num<<" "<<obja.chaine<<std::endl;
    en t'indiquant que num et chaine sont "private in this context" (inaccessibles car privés dans le contexte dans lequel tu essaye de les utiliser)

    Par contre, tu pourrais tres bien décider de créer une fonction membre du genre de (en la déclarant public, cela va de soi)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void A::Print()
    {
        std::cout<<num<<" "<<chaine<<std::endl;
    }
    Comme la fonction membre d'une classe peut accéder à sa guise aux membre de la classe à laquelle elle appartient, c'est on ne peut plus valide
    Tu l'appelleras sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    A obja;
    //gestion de obja ...
    obja.print();//appel de la fonction membre Print()
    Si tu veux intégrer l'affichage dans un affichage plus "conséquent", il risque d'être lourd de devoir écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    std::cout<<"voici les informations de obja"<<std::endl;
    obja.Print();
    std::cout<<"Merci et au revoir"<<std::endl;
    Mais, comme les opérateurs peuvent etre surchargés, tu peux tout aussi bien décider de surcharger l'opérateur << de manière publique pour ta classe A, ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    std::ostream& A::operator<<(std::ostream& oss)
    {
       // on est bien dans une fonction membre de A
       oss<<num<<" "<<chaine;
        return oss;
    }
    Du fait que l'opérateur << est surchargé pour la classe A, il devient fonction membre de la classe A, avec tout ce que cela implique au niveau des autorisations par rapport aux membres de A...

    Ce qui te permettra alors d'écrire tout simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    std::cout<<"voici les informations de oja"<<std::endl
             <<obja<<std::endl
             <<"merci et au revoir"<<std::endl;
    Et, comme l'operateur << est public dans A, le compilateur ne verra aucune objection à l'utiliser
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre très actif
    Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Par défaut
    ça c'est de la réponse ! merci bien en tout cas pour ce rappel !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. cin et cout : erreurs
    Par black-falco dans le forum Visual C++
    Réponses: 9
    Dernier message: 07/01/2008, 13h01
  2. [débutant]problème à l'utilisation de cin et cout
    Par Damien B. dans le forum SL & STL
    Réponses: 6
    Dernier message: 07/05/2007, 19h23
  3. reconnaissance de 'cout' et 'cin'
    Par tony carron dans le forum C++Builder
    Réponses: 5
    Dernier message: 24/12/2006, 17h07
  4. [debutant] changer le nom de cin, cout
    Par rolphbrua dans le forum SL & STL
    Réponses: 1
    Dernier message: 15/01/2006, 20h11
  5. STL cin, cout ...
    Par oxor3 dans le forum SL & STL
    Réponses: 11
    Dernier message: 29/08/2004, 16h22

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