Professional Documents
Culture Documents
Introduction
Vrifications de type + stricte Surcharge de fonctions et des Oprateurs Rfrences Gestion mmoire + facile Entres/sorties + facile Classes et hritage Programmation gnrique ...
C++ = C +
Introduction
Tout comme en C, un module C++ est gnralement implant par un fichier dinterface et un fichier dimplmentation. .hh, .H ou .hpp, fichiers dinterface contenant les services offerts par le module. .cc, .C ou .cpp, fichiers dimplmentation C++
Introduction
Principe POO: Notion de classe Des objets similaires peuvent tre informatiquement dcrits par une mme abstraction : une classe mme structure de donnes et mthodes de traitement valeurs diffrentes pour chaque objet Classe Perssone -nom, prnom, statut Classe Lecteur -nom, prnom
Introduction
Principe POO
Programmation par Objet: Unit logique : Objet Objet dfini par : Un tat Un comportement Une identit Personne Variable: age=32 Methode: get_age() Comportement tat : reprsent par des attributs(variable) qui stockent des valeurs. Comportement : dfini par des mthodes qui modifient un tat. Identit : permet de distinguer un objet dun autre objet. tat Identit
Nouvelles Entres/Sorties
Les entres-sorties on t remanies pour profiter de la surcharge!!!. Pour pouvoir les utiliser il faut inclure len-tte <iostream> Il existe trois flots :
cin : entre standard (clavier par dfaut) cout : sortie standard (cran par dfaut) cerr : sortie message derreur (cran par dfaut)
Les oprateurs << et >> permettent de faire les critures et les lectures Ils sont surchargs pour permettre lutilisation de tous les types primitifs
Nouvelles Entres/Sorties
C
#include <stdio.h>
C++
#include <iostream> #include <fstream> #include <strstream> cout -> standard output cerr -> standard error output cin <- standard input ofstream -> output file ifstream <- input file ostringstream -> char*[N] istringstream <- char*[N] ostream& operator<< istream& operator>>
scanf <-- standard input fprintf --> FILE* fscanf <-- FILE* sprintf --> char[N] sscanf <-- char*[N]
Nouvelles Entres/Sorties
Il ny a plus de problmes de type.
printf et scanf vs cin et cout
gnres
sont
plus
Nouvelles Entres/Sorties
Exemple
C
#include <stdio.h> int valeur = 10;
C++
#include <iostream> using namespace std; int valeur = 10;
printf( valeur = %d\n,valeur ); cout << Valeur= << valeur<<endl; printf( New valeur = ??\n ); scanf( %d, &valeur ); cout << New valeur = ?? <<endl; cin >> valeur;
Dclarations/Allocation
Allocation dynamique grce aux oprateurs new et delete (ne plus utiliser malloc et free !!) Il nest plus ncessaire dutiliser sizeof Pour les tableaux les oprateurs new et delete sont remplacs par new[] et delete[]
Dclarations/Allocation
Exemple
C
Boucles
int i; for (i=0; ;)
C++
for(int i=0 ; ; ) /* Cette possibilite sappliquee sur toutes les instructions : switch, while et do while */
Tableaux
int value = 10; int* var = (int*)malloc(sizeof(int)); *var = value; int* array = (int*)malloc(n*sizeof(int)); ... free( var ); free( array ); int value = 10; int* var = new int( value ); int* array = new int[10]; ... delete var; delete [] array;
Notion de Rfrence
En plus des pointeurs, les rfrences sont une autre manire de manipuler les adresses des objets placs dans la mmoire. Une valeur de type rfrence est une adresse mais, hormis lors de son initialisation, toute opration effectue sur la rfrence agit sur l'objet rfrenc, non sur l'adresse
int n; int & ref = n; n = 3; Cout << la valeur de n est : << ref << endl
int & ref=n; signifie que ref est une rfrence sur la variable n
Les Classes
Une classe permet de dfinir (interface et implmentation) un objet en terme de structure de donnes et de fonctionnalits. On trouve lintrieur dune Classe C++ :
Les attributs (variables dfinies dans la classe) Les mthodes (services offerts par la classe)
Pour dclarer une classe il faut utiliser le mot cl class. Les attributs et mthodes sont ensuite dfinis comme les champs dans une structure C
Les Classes
Publique, Protg ou Priv
Les structures en C ne permettent que de runir des variables, en C++ une classe y ajoute des fonctions. Une classe C++ peut comporter plusieurs sections public, protected ou private qui permettent de modifier le niveau de masquage des informations. public : attributs et/ou mthodes accessibles par nimporte quel client de la classe. protected ou private : attributs et/ou mthodes inaccessibles aux clients extrieurs de la classe. (On verra la diffrence entre ces deux notions un peu plus tard) Les attributs et les fonctions sont par dfaut privs (Private)
Les Classes
Publique, Protg ou Priv et lencapsulation
Par convention les attributs de la classes sont protected ou private. On les dclare dans une section autre que public. Consquence : les attributs ne sont plus directement accessibles ! Il faut des mthodes daccs publiques. Cest ce quon appelle lencapsulation.
Les Classes
Utilisation
Une classe dfinit un type qui peut tre utilis comme tout autre type disponible Laccs aux champs (mthodes et attributs) se fait de faon pointe (.) (objet ou rfrence sur objet) La notation flche (->) est utilise lorsque lon dispose dun pointeur sur un objet.
{
private:
Dclaration des donnes prives et des fonctions membres prives
public:
Dclaration des donnes publiques et des fonctions membres publiques
};
::
:: getY(){
Linstanciation dune classe ou la cration dun objet dune classe se faite comme suivant:
Cration dun objet
Classe : Point - int x - int y + getX() + getY() + setX(int) + setY(int) + deplacer(int,int) + affichePoint()
. p2.affichePoint();
p1 affichePoint(); P3->affichePoint();
Les Accesseurs/Modificateurs
Les accesseurs sont des mthodes membre qui permet daccder aux attributs dun objet
Exemple
get_num_client() // pour accder au numro de client get_solde() // pour accder au solde de client
Les modificateurs sont des mthodes membre qui modifie ltat (attributs) de lobjet
Exemple
set_num_client(nouveau_num) Set_solde(nouveau_solde)
Constructeur/Destructeur
Il est souvent ncessaire dinitialiser un objet au moment de la cration. Parfois il faut mme effectuer de lallocation de mmoire. Il est donc ncessaire de disposer dune (ou plusieurs) mthode(s) spciale(s) pour faire cette initialisation : le Constructeur. De la mme faon il faut pouvoir dsallouer de la mmoire utilise par un objet lorsque lon ne lutilise plus. On utilise alors une mthode particulire : le Destructeur
Constructeur
Les constructeurs nont aucun type de retour (mme pas void !!!). Ils portent le mme nom que la classe laquelle ils appartiennent Il sont rarement appels explicitement par le programmeur. Le compilateur se charge dutiliser le bon constructeur (surcharge!!) la cration de lobjet.
Destructeur
Il ny a quun seul destructeur par classe!!! Son identificateur est compos du nom de la classe prcd du signe : ~Type(). I Les destructeurs nont pas de paramtres ni de type de retour. Il est prfrable de prfixer les destructeurs par le mot cl virtual. (on verra une explication plus tard dans le cours) Les destructeurs ne sont jamais explicitement appell par le programmeur.
Constructeur/Destructeur
Exemple
class Point { private: int x; inty; public:
main{ Point p0; Point p1=Point(); Point p1(2,5); Point p2=Point(11,6); Point* p3=new Point(); p0.affichePoint(); P3->affichePoint();
x=0; y=0; } Point :: Point(int a,int b){ x=a; y=b; } int Point :: getX(){ return x; }
Dclaration de destructeur
Destructeur
delete p3; }
Destruction de lobjet p3
Mot cl THIS
Le mot cl this est le symbole de lauto-rfrence. Lorsquune fonction membre est appele elle implicitement une rfrence vers lobjet appelant. reoit
En gnral, laccs aux attributs privs se fait de faon directe. Dans certain cas, on a besoin de connatre ladresse de lobjet appelant (insertion dun objet dans une liste) this est un pointeur vers cet objet appelant Il ne peut tre utilise que dans les fonctions membres.
Mot cl THIS
Exemple
class Point { private:
this dfinit
implicitement
public:
int x; int y; Point(); Point(int, int); ~Point(); void setX(int); void setY(int); }; Point :: Point(){ x=0; y=0;} Point :: Point(int x,int y){
Variable locale
this->x=x; this->y=y;}
this->x=x;
} void Point :: setY(int y){
Variable membre
Pointeur
this->y=y;
}
Exercice: constructeur/destructeur
Crer les classes suivantes. Les interfaces sur des fichiers .h et les implmentations sur .cpp
Client - num_client - nom - prenom -CIN - CompteBancaire + Client() + Client(num_clien) + Client(num_client, nom, prenom) + Client(CompteBancaire) /* ajoutez les accesseurs et les modificateurs */
Exercice
On peut dfinir des fonctions de mme nom mais se diffrentiant par le nombre et le type d'arguments. Le systme choisira la fonction appeler selon les arguments.
Additionneur - somme: int - somme: float - somme: double /* surcharge de la mthode somme */
Lhritage
Lhritage est lun des fondamentaux de la programmation oriente objet Il est la base des possibilits rutilisation des composants logiciels. de
Il permet une drivation dune classe en une classe drive plus spcialise.
Lhritage
Spcifications Classe Drive = Spcifications Classe Anctre + Nouvelles Spcifications Hritage des donnes et des fonctions membres sauf:
Les constructeurs et destructeurs de l'anctre
Lhritage
Par exemple :
On possde une classe Article comportant les attributs suivants (nom, prixBrut, quantit).
On peut trs bien construire une classe Boisson partir de cette classe en y ajoutant uniquement un attribut supplmentaire (volume)
Lhritage
La drivation de classe est la technique qui consiste faire hriter une classe dune autre classe. On dit quune classe B est drive dune classe A si elle en hrite. A est alors appele la superclasse ou la classe de base de la classe B Syntaxe d'hritage
class nom_nouvelle_classe : type hritage nom_anctre {};
Lhritage
Exemple
class Point3D : public Point { private: int z; public: Point3D(); Point3D(int,int,int); ~Point3D(); void setZ(int); int getZ(); };
Lhritage
Type d'hritage
Rgles de drivation de classe
mode de drivation private statut du membre dans la classe anctre
private protected public private protected public private protected public
protected
public
Lhritage
Lors de la construction dun objet, tous les constructeurs de la hirarchie dhritage sont automatiquement appel du plus gnral au plus particulier. Lors de la destruction les destructeurs de la hirarchie sont appel du plus spcifique au plus gnral. Il est possible de redfinir des mthodes de la classe mre dans une classe fille. Lentte de la mthode doit tre identique loriginale. La mthode initiale reste utilisable mais il faut la prfixer par le nom de la classe dans laquelle elle a t dfinie.
Exercice
placer la dfinition de la classe dans un fichier header (.h ou hpp) et son implmentation dans un fichier de mme nom mais d'extension (.cpp). Tester la classe Employe Personne
strcpy(distination,source): permet de copier une chane de caractre.(String.h) strlen(char*): fonction que retourne la taille dun chane de caractre.
Lhritage Multiple
En C++ une classe peut hrite de plusieurs classe en mme temps: Hritage multiple.
Lhritage Multiple
Exemple
A int a A(int a){this->a=a;} Afficher{cout<<a;} int b A(int b){this->b=b;} Bfficher{cout<<b;} main{ C c(1,2,3); c.Afficher(); c.Bfficher(); c.Cfficher(); } B
Le programme affiche : C(int a, int b,int c) : A(a) , B(b) {this->c=c;} Cfficher{cout<<c;} 123
Lhritage Multiple
Exemple
A int a somme(int a,intb){ a+b; } int b somme(int a,intb){ a+b; } C c(1,2,3); c.somme(); } Ambigut C : public A, public B Le nom de la fonction ne permet pas de dire laquelle des deux fonctions doit tre appele. Il faut donc spcifier le chemin d'accs compltement. main{ C c(1,2,3); c.A::somme(); c.B::somme(); } B main{
Hritage Virtuel
Z A : public Z B : public Z
C : public A, public B A et B drivent dune mme troisime Z, une drivation de A et B placera dans la classe drive C deux copies de Z.
Il est possible dviter ce comportement lorsquil nest pas ouhaitable. Il faut pour cela que les classes A et B aient t drives de manire virtuelle de Z
Hritage Virtuel
Z A : virtual public Z B : virtual public Z
C : public A, public B
La classe C dans ce cas ne contient quune instance de Z. Les classes A et B sont identiques ce quelles taient auparavant, sauf que le compilateur sait que linstance de Z peut tre un emplacement inhabituel (cest le cas dans C); les deux classes doivent tre drives virtuellement de Z.
Exercice
Personne Etudiant Enseignant Etudiant_Enseignant Etudiant ayant les mmes caractristiques qu'une Personne plus une liste de matires suivies et un ensemble de notes. On doit pouvoir obtenir la liste des matires, affecter une note, calculer la moyenne. Enseignant ayant les mmes caractristiques qu'une Personne plus une liste de matires enseignes, un nombre d'heures par matire et un tarif horaire. On doit pouvoir obtenir les matires, faire un calcul du nombre d'heures total et dterminer le cot de l'enseignant. On dfinit une classe Etudiant_Enseignant qui hrite des classes Etudiant et Enseignant afin de caractriser un tudiant qui donnerait des cours.
Fonction Virtuel
A
class A{ public: void saisir(); }; void A::saisir(){ cout <<" classe A" ; }
B
Class B : public A { public: void saisir(); }; void B::saisir(){ cout <<" classe B" ; }
A
class A{ public:
B
virtual void
Class B : public A { public: void saisir(); }; void B::saisir(){ cout <<" classe B" ; }
Main
int main(){ B b; A *a=&b;
Main
A->saisir(); b.saisir();
}
A->saisir();
}
b.saisir();
Pour viter ce comportement, il faut dire la classe A que sa mthode f est susceptible d'tre redfinie par ses classes drives. On parle alors de mthode virtuelle.
Les Amis
On a vu que le masquage des donnes impliquait un accs impossible aux membres privs ou protgs dune classe par une autre classe indpendante. Dans certain cas, il est utile davoir accs aux membres privs dune autre classe sans changer le masquage. Pour cela nous allons utiliser des fonctions amies Lamiti autorise laccs tous les membres privs La dclaration se fait par le mot cl friend
Les Amis
Il existe plusieurs situation damiti :
Fonction indpendante, amie dune classe Fonction membre dune classe amie dune autre classe Fonction amie de plusieurs classes Toute les fonctions membres dune classe, amies dune autre classe
Autre.h
#include<iostream> using namespace std; void afficher (Tableau t){ cout<<" [" ; for( int i=0 ; i < t "; cout<<" ]" ; }
Variable prive
Variable prive
ou ici
};
Tableau.cpp
#include"Tableau.h" Tableau::Tableau(int nombre){ nbr = nombre; tab=new int[nombre]; } Tableau::~Tableau(){ delete tab; }
Main.cpp
#include "Tableau.h" #include "Autre.h" int main(){ Tableau T(5); Afficher(T); }
Ce nest plus une fonction membre de point. Lemplacement de la dclaration damiti est indiffrent.
Cest le mme principe que pour une mthode non membre, amie dune classe. Par exemple :
on met friend void f(A,B); dans les deux classes A et B. On dfinit ensuite la fonction void f(A...,B...) o lon veut.
Toute les fonctions membres dune classe, amies dune autre classe
Cest une gnralisation du cas fonction membre, amie dune autre classe. On pourrait dclarer amie toutes les mthodes concernes. Il est plus simple de placer dans la classe A linstruction suivante : friend class B; Dans ce cas toutes les fonctions membres de la classe B sont amies de la classe A.
Toute les fonctions membres dune classe, amies dune autre classe
Exemple
On utilise la notion dami lorsque lon a deux classes dont lune doit avoir accs aux donnes membres prives de lautre. Cette faon de faire permet de limiter une seule classe laccs des donnes prives et de ne pas devoir rendre celles-ci publiques ce qui les rendrait disponibles pour tout objet ou classe.
#include <iostream> using namespace std; void B::change(A &a) { a.i = 145; } void B::affiche(A a) { void change (A&); void affiche(A); }; class A { int i; int main() { A a(5); B b; b.affiche(a); b.change(a); b.affiche(a); return 0; } cout << a.i << endl;
class A;
class B { public:
//prive
}
friend class B;
public: A(int a){i=a;}; };
operator.
Il n'est pas possible d'inventer de nouveaux oprateurs ; seuls des oprateurs dj connus du compilateur peuvent tre surchargs. Tous les oprateurs de C++ peuvent tre surchargs, sauf les cinq suivants :
.*
::
sizeof
Les Exceptions
Une exception est linterruption de lexcution du programme la suite dun vnement particulier. Le but des exceptions est de raliser des traitements spcifiques aux vnements qui en sont la cause. Ces traitements peuvent rtablir le programme dans son mode de fonctionnement normal, auquel cas son excution reprend. Il se peut aussi que le programme se termine, si aucun traitement nest appropri. Le C++ supporte les exceptions logicielles, dont le but est de grer les erreurs qui surviennent lors de lexcution des programmes. Lorsquune telle erreur survient, le programme doit lancer une exception. Lexcution normale du programme sarrte ds que lexception est lance, et le contrle est pass un gestionnaire dexception. Lorsquun gestionnaire dexception sexcute, on dit quil a attrap lexception.
Les Exceptions
try{
// Code susceptible de gnrer des exceptions
} catch(classe & e ){
//Traitement de lexception associe la classe
Les Exceptions
Exemple
Main erreur
int cause erreur(int c):cause(c){} erreur(erreur &source) : cause(source.cause) {} int i; cout << "Tapez 0 pour gnrer une exception Erreur et 1 pour une Entire :"; cin >> i; cout << endl; try { switch (i) { case 0:{ erreur a(0);
throw (a);
} case 1:{
autre
} default:{
} }
Equivalence
erreur(int c):cause(c){} erreur(int c){cause=c;} erreur(erreur &source) : cause(source.cause) {} erreur(erreur &source) {cause=source.cause;}
} catch (erreur &tmp) { // Exception de type erreur cout << "Erreur erreur ! (cause " << tmp.cause << ")" << endl; } catch (int tmp) { // Exception de type int cout << "Erreur int ! (cause " << tmp << ")" << endl; } catch (...) { // Toutes les autres Exceptions cout << "Exception inattendue !" << endl; }
Les Exceptions
Autres exception dans C++
Nom de la classe bad_alloc bad_cast bad_exception bad_typeid ios_base::failure EXEMPLE: catch(bad_alloc e){cout<<e.what();} La fonction what affiche lerreur gnr par le programme Description Lance s'il se produit une erreur lors d'un new. Lance s'il se produit une erreur lors d'un chec dans une rfrence. Lance si aucun catch ne correspond un objet lanc. Lance s'il se produit une erreur lors d'un typeid. Lance s'il se produit une erreur avec un flux (iostream).
Exercice: Exception
Crer les 3 classes suivantes: creer_vecteur
public int er creer_vecteur(int);
limite_vecteur
public int er limite_vecteur(int);
vecteur
int nbreElement int* vect vecteur(int); main (){ ~vecteur(); try{ int & operator [] (int)) vecteur v(-3) ; // Exception crer_vecteur v[11] = 5 ; // Exception limite_vecteur } catch (limite_vecteur lv){ cout << "Exception indice " << lv.er << " hors limites \n" ; exit (-1) ; } catch (creer_vecteur cv){ cout << " Exception creation vecteur nb elem = " << cv.er << "\n" ; exit (-1) ; } }
La classe string
Les objet de la classe string sont des conteneurs des caractres, spcifiquement conus pour oprer des squences de caractres (chane de caractres). La classe string est un type simple utiliser, sr, complet et performant pour le traitement des chanes de caractres, presque toujours trs largement prfrable au pnible type char * de C.
La classe String
Mthodes Dclaration
String ch("Bonjour");
ch.length() : renvoie la langueur de ch ch.max_size() : ch.compare("bjr") : comparaison de deux chane (renvoie-1) ch += "BB" : ch est BonjourBB, cest la concatnation ch.insert(4,"AA") : ch est BonjAAourBB ch.erase(4,2) : ch est BonjourBB ch[4]='? : ch est Bonj?ourBB ch.replace(3,5,"soir") : ch est BonsoirBB
La classe String
Mthodes
ch.find("abc") : recherche de la sous chane "abc" (1 si oui) ch.rfind("abc") :recherche de la sous chane depuis la fin ch.find_first_of(a') :premire occurrence du caractre a ch.find_last_of(x') : dernire occurrence du caractre x substr(2,4) :extraction de 4 caractres partir 2me caractre ch.c_str() : obtention de la rfrence.
Les fichiers ouverts par association avec une variable de type ofstream (lecture avec ifstream) sont buffriss. Ce mcanisme permet au systme dobtenir une excution plus rapide en gardant en mmoire les critures demandes, et en les effectuant en bloc , lorsque le volume de donnes transfrer es suffisant.
Il arrive que cette faon de fonctionner poses des problmes, notamment lorsquune fonction cherche lire dans un fichier des donnes qui ny ont pas encore t rellement crites !!!!
Void demo(){ ofstream fichier ("essai.txt"); if(!fichier) return; fichier<< 123456789; maFonction(); } Cration dun fichier + criture Void maFonction(){ ifstream fichier ("essai.txt ") int chiffre; if(fichier) fichier>> chiffre; // lecture choue } Lecture des donnes
Exemple:
ifstream fichier("essai.txt",ios::in) Ou ifstream fichier("essai.txt")
Il y a plusieurs mthodes qui permet de lire les lignes, le caractres et les chiffres qu'il faut employer en fonction de ce que l'on veut faire
getline(flux, chaineDeCaractres) : lire une ligne complte flux.get(caractre) : lire un caractre flux >> variable : pour rcuprer partir du fichier jusqu' un dlimiteur (espace, saut la ligne, ...).
string ligne; while(getline(fichier, ligne)) { cout << ligne << endl;} //lecture dun fichier
char caractere; fichier.get(caractere); cout << caractere; // lecture dun caractre int i, j; string s1, s2; fichier >> i >> j >> s1 >> s2; //lecture jusqu' l'espace
Pour l'criture:
flux << var : crit dans le fichier le variable var de nimporte quel type (string, int, ...) ; flux.put(caractre) : crit un seul caractre dans le fichier.
Exemple
string CIN = "AB 111111"; int age = 22; fichier << "Num CIN : " << CIN<< endl; fichier << "age: " << age << endl;
Ifstream:
tellg() : savoire la position courant en octets Seekg(nombre_octets, position)
Ofstream
tellp(): savoire la position courant en octets seekp(nombre_octets, position)
Pour la position:
ios::beg ios::cur ios::end Dbut de fichier (beginning) La position disertion actuelle(current) La fin du fichier
Template: Fonction
Dclaration
template <class identifier>declaration_fonction; template <nomType identifier>declaration_fonction;
Les deux dclaration sont valide et non distinct mme avec le mot class
Template: Fonction
Exemple
double getMax (double a, double b) { return (a>b?a:b); } int getMax (int a, int b) { return (a>b?a:b); }
Pour chaque type de donne il faut dclar une fonction qui lui convient. template <class T> T getMax (T a, T b) { return (a>b?a:b); }
int main () { int i=5, j=6, k; long l=10, m=5, n; k=getMax(i,j); n=getMax(l,m); cout << k << endl; cout << n << endl; return 0; }
laide des templates on implmente une seul fonction pour touts les types
int main () { int i=5, j=6, k; long l=10, m=5, n; k=getMax<int>(i,j); n=getMax<long>(l,m); cout << k << endl; cout << n << endl; return 0; }
Template: fonction
Exemple
ou simplement
i = getMax (j,l)
Template: Class
Comme les fonctions templates, les classes aussi peuvent tre des templates. Dclaration
template <class nom_type > class nom_class{};
Template: Class
Exemple
#include <iostream> using namespace std; template <class T> class point { private : T x,y; public: point (T a, T b) { x=a; y=b; } T getX (); double centre(); }; template <class T> T point<T>::getX (){ return x; } template <class T> double point<T>::centre(){ return ((x+y)/2); }
int main () { point <int> p(100, 75); cout << p.getX(); return 0; }