24
Chapitre 3 : Les classes Niveau : II1 Préparé par : Raoudha CHEBIL 1 Bibliothèque de flots 54 Souvent, nous avons été amenés à écrire sur la sortie standard. Pour ce faire, nous avons utilisé des instructions telles que : cout << n ; Cette instruction fait appel à l'opérateur <<, auquel elle fournit deux opérandes correspondant respectivement au "flot de sortie" concerné (ici cout) et à l'expression dont on souhaite écrire la valeur (ici n). Nous avons aussi été amenés à lire sur l’entrée standard en utilisant des instructions telles que : cin >> x ; Cette instruction fait appel à l'opérateur >>, auquel elle fournit deux opérandes correspondant respectivement au "flot d'entrée" concerné (ici cin) et à la lvalue dans laquelle on souhaite lire une information. Bibliothèque de flots 55 D'une manière générale, un flot peut être considéré comme un "canal": recevant de l'information – flot de sortie, fournissant de l'information – flot d'entrée. Les opérateurs << ou >> servent à assurer le transfert de l'information, ainsi que son éventuel "formatage".

classes-2-2

Embed Size (px)

DESCRIPTION

Chap3

Citation preview

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 1

    Bibliothque de flots54

    Souvent, nous avons t amens crire sur la sortie standard.

    Pour ce faire, nous avons utilis des instructions telles que :

    cout > x ;

    Cette instruction fait appel l'oprateur >>, auquel elle fournit deux oprandescorrespondant respectivement au "flot d'entre" concern (ici cin) et la lvaluedans laquelle on souhaite lire une information.

    Bibliothque de flots55

    D'une manire gnrale, un flot peut tre considr comme un "canal" :

    recevant de l'information flot de sortie,

    fournissant de l'information flot d'entre.

    Les oprateurs > servent assurer le transfert de l'information, ainsique son ventuel "formatage".

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 2

    Bibliothque de flots56

    Un flot peut tre connect un priphrique ou un fichier.

    Par convention, le flot prdfini cout est connect ce que l'on nomme la sortie standard .

    De mme, le flot prdfini cin est connect ce que l'on nomme l'entre standard .

    Bibliothque de flots57

    L'entre standard correspond par dfaut au clavier .

    La sortie standard correspond par dfaut lcran.

    Mais il est possible de rediriger l'entre standard ou la sortie standard vers un fichier.

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 3

    Bibliothque de flots58

    En dehors de ces flots prdfinis, l'utilisateur peut dfinir lui-mmed'autres flots qu'il pourra connecter un fichier de son choix.

    On peut dire qu'un flot est un objet d'une classe prdfinie, savoir :

    ostream pour un flot de sortie,

    istream pour un flot d'entre.

    Chacune de ces deux classes surdfinit les oprateurs > pour les diffrents types de base.

    Leur emploi ncessite l'incorporation du fichier en-tte iostream.

    Classe ostream59

    Oprateur

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 4

    Classe ostream60

    Cet oprateur

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 5

    Classe ostream

    Tous les types de base sont accepts par loprateur

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 6

    Classe ostream

    64

    Si la valeur fournie setw est insuffisante pour l'criture de la valeursuivante, cette dernire sera crite selon les conventions habituelles(elle ne sera donc pas tronque).

    #include #include using namespace std ;

    void main(){ int n = 12345 ;int i ;for (i=0 ; i

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 7

    66

    Classe istream67

    Oprateur >>

    Dans la classe istream, l'oprateur >> est surdfini pour tous les types debase y compris char * sous la forme :

    istream & operator >> (type_de_base & )

    Son rle consiste extraire du flot concern les caractres ncessaires pourformer une valeur du type de base voulu.

    Il fournit comme rsultat la rfrence au flot concern, aprs qu'il en aextrait l'information voulue. Cela permet de l'appliquer plusieurs fois desuite, comme dans :

    cin >> n >> p >> x ;

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 8

    Classe istream

    Les types accepts par loprateur >> sont :

    - bool, char (et ses variantes signed et unsigned), short(et sa varianteunsigned), int (et sa variante unsigned), long (et sa variante unsigned),float, double et long double.

    - Parmi les types pointeurs, seul char* est accept : dans ce cas, on lit unechane de caractres.

    - Le type string (chanes de type classe) sera accept (il jouera un rlecomparable aux chanes de caractres, avec moins de risques).

    - Les autres types classes seront accepts si lon y a surdfiniconvenablement loprateur >>.

    68

    Les tableaux ne sont pas accepts, sauf les tableaux de caractres (on y lit une chane de caractres, termine par un caractre nul).

    Surdfinition de > pour les typesdfinis par lutilisateur

    69

    Les deux oprateurs >, surdfinis respectivement dans les classesostream et istream pour les diffrents types de base, peuvent tre surdfinispour n'importe quelle classe cre par l'utilisateur.

    Mais il faut tenir compte des remarques suivantes :

    Ces oprateurs doivent recevoir un flot en premier argument, ce qui empchede les surdfinir sous la forme dune fonction membre de la classeconcerne.

    Notez qu'on ne peut plus les surdfinir sous la forme dune fonction membrede la classe istream ou ostream, car l'utilisateur ne peut plus modifier cesclasses qui lui sont fournies avec C++.

    Il s'agira donc de fonctions amies de la classe concerne.

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 9

    Surdfinition de > pour les typesdfinis par lutilisateur

    70

    La valeur de retour sera obligatoirement la rfrence au flot concern(reu en premier argument).

    On peut dire que toutes les surdfinitions de suivront ce schma :

    istream & operator >> (istream & entree, type_classe & objet)

    Exemple71

    On suppose qu'une "valeur de type point" se prsente toujours (aussi bien en lecture qu'en criture) sous la forme :

    < entier, entier >

    #include using namespace std ;

    class point{ int x, y ;public :point (int abs=0, int ord=0){ x = abs ; y = ord ; }friend ostream & operator > (istream &, point &) ;} ;

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 10

    72

    ostream & operator y >> c ;if (c != '>') ok = 0 ;}}if (ok) { p.x = x ; p.y = y ; } // on n'affecte p que si tout est OKelse entree.clear (ios::badbit | entree.rdstate ()) ;return entree ;

    }

    // Le statut derreur du flot est gr par un ensemble de bits : // clear (activation de bits derreur)// badbit (bit activ quand le flot est dans un tat irrcuprable)// rdstate() pour activer le bit badbit sans activer les autres

    Exemple

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 11

    74

    Utilisation :

    void main()

    {

    point a, b ;

    cout > a)

    cout

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 12

    76

    Une fois lobjet de la classe ofstream construit, l'criture dans le fichier quilui est associ peut se faire comme pour n'importe quel flot en faisantappel toutes les facilits de la classe ostream (dont drive ofstream).

    Exp:

    sortie

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 13

    78

    Pour associer un flot d'entre un fichier, on emploie un mcanismeanalogue celui utilis pour un flot de sortie. On cre cette fois un objetde type ifstream, classe drivant de istream.

    Il faut toujours inclure le fichier en-tte fstream en plus du fichier iostream.Le constructeur comporte les mmes arguments que prcdemment, c'est--dire le nom de fichier et le mode d'ouverture.

    Par exemple:

    ifstream entree ("truc.dat", ios::in) ;

    l'objet entree de la classe ifstream sera associ au fichier de nom truc.dat ,aprs qu'il aura t ouvert en lecture.

    Connexion dun flot dentre un fichier

    79

    Aprs avoir construit un objet de la classe ifstream, la lecture dansle fichier qui lui est associ pourra se faire comme pourn'importe quel flot d'entre en faisant appel toutes les facilitsde la classe istream (dont drive ifstream).

    Par exemple, aprs la dclaration prcdente de entree, nous pourrionsemployer des instructions telles que :

    entree >> ... >> ... >> ... ;

    pour raliser des lectures formates

    entree.read();

    Pour raliser les lectures binaires

    Connexion dun flot dentre un fichier

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 14

    Exemple

    80#include

    #include

    #include

    using namespace std ;

    const int LGMAX = 20 ;

    void main()

    { char nomfich [LGMAX+1] ;

    int n ;

    cout > setw (LGMAX) >> nomfich ;

    ifstream entree (nomfich, ios::in) ;

    if (!entree) { cout

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 15

    82

    class exple

    { static int n ;

    float x ;

    ...

    } ;

    exple a, b ;Objet a Objet b

    a.x b.x

    a.n b.n

    Membre donne statique

    Un membre donne dclar avec le qualificatif static est partag par tous lesobjets de la mme classe ;

    Il existe mme lorsquaucun objet de cette classe na t dclar ;

    o Un membre donne statique nest pas initialis par le constructeur , ildoit tre initialis explicitement, lextrieur de la classe, en utilisantloprateur de porte (::) pour spcifier sa classe.

    o Cette dmarche est utilisable aussi bien pour les membres static privsque publics.

    o On peut dire que les membres donnes statiques sont des sortes devariables globales dont la porte est limite la classe.

    83

    Membre donne statique

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 16

    84

    class exple

    {

    static int ctr ; // compteur du nombre d'objets crs

    public :

    exple () ;

    ~exple () ;

    } ;

    // initialisation du membre statique ctr

    int exple::ctr = 0 ;

    exple::exple() // constructeur

    { cout

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 17

    86

    #include

    using namespace std;

    class point

    {

    static int nbpt;

    int x,y;

    public:

    point(int a=0, int b=0):x(a),y(b){cout

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 18

    88

    #include

    using namespace std ;

    class cpte_obj

    { static int ctr ; // compteur (statique) du nombre d'objets crs

    public :

    cpte_obj () ;

    ~cpte_obj() ;

    static void compte () ; // pour afficher le nombre d'objets crs

    } ;

    int cpte_obj::ctr = 0 ; // initialisation du membre statique ctr

    }

    void cpte_obj::compte ()

    { cout

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 19

    90

    template class point

    {

    T x ; T y ;

    public :

    point (T abs=0, T ord=0) ;

    void affiche () ;

    } ;

    Patron de classe

    Il est possible de simplifier les choses en dfinissant un patron de classedans lequel le type des coordonnes du point apparat en paramtre.

    Patron de classe

    #include

    using namespace std ;

    // cration d'un patron de classe

    template class point

    { T x ; T y ;

    public :

    point (T abs=0, T ord=0) //fonction en ligne

    { x = abs ; y = ord ;

    }

    void affiche () ;

    } ;

    91

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 20

    Patron de classe

    Pour dfinir la fonction affiche en dehors de la classe, il faut rappeler au compilateur que :

    Dans la dfinition de cette fonction, vont apparatre des paramtres de type dont on fournira la liste :

    Dans ce cas : template

    Le nom du patron concern :

    Dans ce cas : point

    Ainsi lentte de la fonction affiche() devient :

    template void point::affiche()

    {cout

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 21

    Classe string94

    La classe string dispose de beaucoup de constructeurs.

    Certains correspondent aux constructeurs dun vecteur :

    string ch1 ;

    //construction d'une chane vide : ch1.size() == 0

    string ch2 (10, '*') ;

    // construction d'une chane de 10 caractres gaux *

    ch2.size() == 10

    Classe string

    95

    D'autres permettent d'initialiser une chane lors de sa construction, partir de chanes usuelles, constantes ou non :

    string mess1 ("bonjour") ;

    // construction dune chane de longueur 7 : bonjour

    //quivalente :

    string mess1 = "bonjour" ;

    char * adr = "salut" ;

    string mess2 (adr) ;

    // construction chane de 5 caractres : salut

    // quivalente :

    string mess2 = adr ;

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 22

    Classe string96

    On dispose d'un constructeur de recopie usuel :

    string s1 ;

    .....

    string s2(s1)

    // ou string s2 = s1 ;

    construction de s2 par recopie de s1

    // s2.size() == s1.size()

    Classe string97

    Les oprateurs : , +, +=, =, ==, !=, =, sont surdfinis pour la classe string

    Quelques fonctions frquemment utilises :

    string ch ;

    Fonction indpendante getline :getline (cin, ch) ;

    // lit une suite de caractres termine par une fin de ligne

    // et la range dans lobjet ch (fin de ligne non comprise)

    getline (cin, ch, x) ;

    // lit une suite de caractres termine par le caractre x

    // et la range dans lobjet ch (caractre x non compris)

    La longueur de la chane ainsi constitue pourra tre obtenue par ch.length() ou ch.size().

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 23

    Classe string

    98

    Concatnation : string ch1 ("bon") ; // ch1.length() == 3

    string ch2 ("jour") ; // ch2.length() == 4

    string ch3 ; // ch3.length() == 0

    ch3 = ch1 + ch2 ;

    /* ch3.length() == 7 ; ch3 contient la chane "bonjour" */

    ch3 = ch1 + ' ' ;

    /* ch3.length() == 4 */

    ch3 += ch2 ;

    /* ch3.length() == 8 ; ch3 contient la chane "bon jour" */

    ch3 += " monsieur"

    /* ch3 contient la chane "bon jour monsieur" */

    Classe string99

    La fonction membre find permet de rechercher, dans une chane donne,la premire occurrence :

    d'une autre chane (on parle souvent de sous-chane) fournie soit parun objet de type string, soit par une chane usuelle,

    d'un caractre donn.

    Par dfaut, la recherche commence au dbut de la chane, mais on peut la faire dbuter un caractre de rang donn.

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 24

    Classe string100

    string ch = bonjour" ;

    string mot ("on");

    char * ad = "jo" ;

    int i ;

    i = ch.find ("ou") ; /* i = 5*/

    i = ch.find (mot) ; /* i = 2 */

    i = ch.find (ad) ; /* i = 4 */

    i = ch.find ('n') ; /* i = 3 */

    i = ch.find (o', 4) /* i =2 , car ici, la recherche dbute ch[4] */

    i = ch.find ('p') ; /* i ch.length() */