Comment les fonction Standards C++ comme (cout<<, cin>>,...) accédent aux attributs private d'une classe utilisateurs ??
Version imprimable
Comment les fonction Standards C++ comme (cout<<, cin>>,...) accédent aux attributs private d'une classe utilisateurs ??
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.
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
Dans se cas de figure, le compilateur refusera un code du genre deCode:
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; };
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)Code:
1
2
3
4 A obja; //gestion de obja std::cout<<obja.num<<" "<<obja.chaine<<std::endl;
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)
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 ;)Code:
1
2
3
4
5 void A::Print() { std::cout<<num<<" "<<chaine<<std::endl; }
Tu l'appelleras sous la forme de
Si tu veux intégrer l'affichage dans un affichage plus "conséquent", il risque d'être lourd de devoir écrireCode:
1
2
3
4 A obja; //gestion de obja ... obja.print();//appel de la fonction membre Print()
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:
1
2
3
4 std::cout<<"voici les informations de obja"<<std::endl; obja.Print(); std::cout<<"Merci et au revoir"<<std::endl;
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...Code:
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; }
Ce qui te permettra alors d'écrire tout simplement
Et, comme l'operateur << est public dans A, le compilateur ne verra aucune objection à l'utiliser ;)Code:
1
2
3
4 std::cout<<"voici les informations de oja"<<std::endl <<obja<<std::endl <<"merci et au revoir"<<std::endl;
ça c'est de la réponse ! merci bien en tout cas pour ce rappel !