Upload
said-h-djo
View
215
Download
0
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() */