Vous êtes sur la page 1sur 27

ESGIS Cotonou

M. Bthel ATOHOUN

Aot 2012

Plan de cours
Programmation Orientes Objet en C++ Rappels Programmation oriente objet : Fondements et justifications de l'approche oriente objet Les classes (Dfinitions, proprits, fonctions et donnes membres) Les fonctions amies La surcharge d'oprateurs L'hritage simple, multiple Les fonctions virtuelles, polymorphisme Les oprateurs d'E/S

Templates et STL (Standard Templates Library) TP

Fondements et justification
Fondements :
- besoin de + en + de qualit dans la dmarche de ralisation des applications - besoin de facilit de maintenance et d'volution des applications

Qualit du logiciel - validit - extensibilit - robustesse

- modularit - rutilisabilit

La conception de larchitecture dun systme peut se faire suivant deux grandes options : conception base sur les traitements ou conception base sur les donnes La premire => - modules ad hoc - traitements dissocis des structures de donnes sous-jacentes - manque de protection des structures de donnes - instabilit des traitements (ajout de fonctionnalits inattendues ou imprvues, maintenance, etc.)

Fondements et justification
La seconde => approche objet - partir des donnes (objets) et trouver les traitements applicables - stabilit des donnes - garantie des principes de qualit Toute donne ou groupes de donnes manipules peut tre reprsente comme un objet.

Gnralits sur C++


Commentaires
/* commentaire dun bloc pouvant tre sur plusieurs lignes */ //commentaire dune ligne ou de la fin dune ligne Ce second type de commentaire a t introduit par C++

Dclaration et initialisation de variable


Mme principe quen C la diffrence quen C++ il est possible de faire la dclaration lendroit o lon en a besoin et non forcment en dbut de bloc comme cela est fait en C.

Porte et visibilit dune variable


Mme principe quen C. Elle stend de lendroit de sa dclaration jusqu la fin du bloc le contenant; y compris les sous bloc de ce bloc. Nota : Dans un bloc, la priorit est donne la variable la plus locale en terme de visibilit en cas dimbrication de blocs avec des variables de mme nom.

Gnralits sur C++


Les types
Le langage C++ hrite de tous les types mis disposition par le langage C mais lune de ses nouveauts est la dfinition de nouveaux types tels que : bool qui dsigne un boolen et dont les deux valeurs possibles sont : true (correspondant la valeur 1) et false (correspondant la valeur 0) string qui dsigne une chaine de caractres. On y reviendra.

Oprateurs
Tous les oprateurs disponibles en C sont reconduits en C++ et sutilisent de la mme faon. Oprateurs arithmtiques : + ,- , *, /, % Oprateurs de comparaison : <, <=, >, >=, ==, != Oprateurs logiques : &&, ||, ! Oprateurs daffectation : = Oprateurs dincrmentation : ++, -Oprateurs associatifs : +=, -=, *=, /=, %=, etc.

Gnralits sur C++


La notion de rfrence
La notion de rfrence est propre au langage C++. Une rfrence est comme un pointeur masqu permettant daccder ladresse dune variable. Il existe deux cadres dutilisation des rfrences : Soit pour la dclaration de variables rfrences; soit pour faire le passage de paramtres une fonction. Dclaration dune variable rfrence : Une variable rfrence est un alias dune autre variable. Syntaxe de dclaration : type & nom_reference = nom_cible; Exemple : int u = 5; int & ref = u; // ref est un alias de u. Passage de paramtre par rfrence : Le passage de paramtre par rfrence est galement une nouveaut du C++ pour palier la lourdeur du passage de paramtre par pointeur qui se fait en langage C. Nous y reviendrons juste ci-dessous dans une rubrique qui prsente dans sa globalit la notion de passage de paramtre.

Gnralits sur C++


Les fonctions
Une fonction est un bloc dinstructions identifi par un nom et spcialis dans un traitement spcifique. Cest donc comme un sous programme dun programme. Les fonctions peuvent recevoir des paramtres pour leur excution et en retour elles peuvent galement renvoyer une valeur dun type spcifi lavance. Syntaxe de dclaration dune fonction :
type_retour nom_fonction ([type [nom_param][, type [nom_param][]]]);

exemples :
int somme (int, int); Int max (int a, int b);

Syntaxe de dfinition dune fonction :


type_retour nom_fonction ([type [nom_param[=valeur]][, type [nom_param[=valeur]][]]])

{ //le code est ici }

Gnralits sur C++


Passage de paramtres une fonctions
En algorithmique il existe deux types de passage de paramtres : passage par valeur et passage par variable, En C parle de passage par valeur et de passage par pointeur. C++ introduit la passage de passage par rfrence. Passage par valeur Le passage par valeur se fait de la mme manire quen C. Exemple : int somme (int a , int b) { return (a+b); } Nota: Dans un passage de paramtre par valeur, cest une copie du paramtre effectif qui est utilise lors de lappel de la fonction. Sa valeur nest donc pas modifie ou modifiable via cette fonction.

Gnralits sur C++


Passage par variable Le passage par variable se faisait en C travers un passage de paramtre par pointeur. Le langage C++ a introduit le passage de paramtre par rfrence qui est plus souple et source de moins derreurs lors de la programmation. Concrtement, il sagit de faire du paramtre formel, une rfrence (donc un alias) du paramtre effectif qui sera pass lors de lappel, La syntaxe de dclaration est la suivante :
type_retour nom_fonction (type1 &, type2 &, ..., typeN &); Exemple : int somme_modif (int &, int );

Pour faire la mme chose en C, la dclaration devait se faire de la sorte :


Exemple : int somme_modif (int *, int );

Ci- dessous les dfinitions de ces fonctions


Passage par pointeur int somme_modif (int * p , int b) { *p= *p + b; return (*p); } Passage par rfrence int somme_modif (int &p , int b) { p = p + b return p; }

Dans ce code, p est respectivement pass par pointeur et par rfrence, mais b est pass par valeur.

Gnralits sur C++


Nota :
Dans un passage de paramtre par variable (par pointeur ou par rfrence), il ny a aucune copie du paramtre effectif, cest son emplacement dans la mmoire qui est directement utilis. La consquence est que toute modification apporte au contenu de la variable lintrieur du code de la fonction, est prise en compte de faon dfinitive.

Notion de Classe
Dfinitions
Objet : entit ou chose concrte ou virtuelle ayant des caractristiques et une ou des fonctions prcises. Attribut : un attribut est une proprit, une caractristique propre un objet Mthode : une mthode est une action (un traitement) applicable un objet. Cest une fonction ou une facult de lobjet. Classe : une classe est une structure (modle, type) de donnes. Cest une famille dobjets ayant les mme attributs et partageant les mme mthodes. Instance : reprsentation particulire (concrtisation dun lment) dune classe. Cest donc un objet dune classe. Spcificateur daccs : un spcificateur daccs est un mot cl qui permet de limiter ou dtendre laccs un attribut, une mthode, ou une classe. En C++ les spcificateurs daccs sont dfinis travers les mots cls public, protected ou private suivi de deux points (: )

Notion de Classe
Dfinitions
Encapsulation : Cest un processus qui assure la protection et la gestion fiable des donnes en les prservant des accs externes non autoriss. Lencapsulation permet de cacher au monde extrieur les dtails dimplmentation dune classe (qui peuvent dailleurs changer ou voluer tout moment) pour ne lui mettre disposition, travers une interface, que les informations dont il a absolument besoin. Lencapsulation est donc une prcaution, un mcanisme pour scuriser la donne contre les accs non autoriss. Elle peut ainsi participer garantir la fiabilit dun programme.)

Syntaxe de dclaration dune classe Utilisation du mot cl class La syntaxe est la suivante :
class nom_classe { [spcificateur daccs] //dclaration des attributs [spcificateur daccs] //dclaration ou dfinition des mthodes };

Notion de Classe
Nota :
Lorsquaucun spcificateur daccs nest prcis, la classe utilise private par dfaut comme spcificateur . public => tout le monde accs aux membres (attributs et mthodes) protected => seuls les membres de la classe et les classes drives (hritiers) ont accs. private => personne dautre que les membres de la classe na accs. Mme pas les descendants.

Exemple :
class Point { private: int x, y; public: void init (int, int); void deplacer(int, int) int getX(){ return x}; int getY(); void afficher(); };

Notion de Classe
Dans cet exemple, la mthode getX a t dfinie directement dans la classe alors que les autres mthodes ont juste t dclares. On parle dans ce cas de mthode inline. Dfinition : Une mthode inline est une mthode qui est soit directement dfinie lintrieur dune classe; soit dfinie en dehors de la classe mais en prcdant sa dfinition du mot cl inline. Avantage => rapidit du code Inconvnient => doivent imprativement tre dfinies dans les fichiers o elles sont utilises, donc pas possibilit dtre rcursive. Pas toujours inline si dfinie hors de la classe. Nota : Il est souvent recommand de faire juste la dclaration des mthodes dune classe et den faire la dfinition en dehors de la classe pour des raisons de lisibilit du code et pour viter certaines limitations. Pour dfinir une mthode hors dune classe, on utilise loprateur de rsolution de porte not ::

Notion de Classe
La syntaxe est la suivante : Type_retour Nom_classe :: Nom_mthode( [liste_paramtres]) { //le code } Exemple : int Point::getY() { return y; } La syntaxe Nom_classe:: permet de dsigner la classe laquelle appartient le membre auquel on veut accder, et dy accder si cela est autoris.

Notion de Classe
Le mot cl this: this est un pointeur interne une classe qui permet de faire rfrence lobjet courant. Une classe est une structure abstraite de donnes dont les instances sont les objets. Les mthodes de la classe sont communes tous les objets de la classes et peuvent tre invoques sur nimporte quelle objet. Dans le code de toutes mthodes invocables sur un objet, le pointeur this est disponible mais est gnralement utilis de faon implicite. Exemple : int Point::getY() { return y; // quivaut : return this->y; }

Notion de Classe
Membres statiques
On distingue les donnes membres (attributs) statiques et les fonctions membres (mthodes) statiques. Donne membre statique Une donne membre statique dune classe est une donne qui appartient la classe, et non aux objets de cette classe. Elle est donc commune tous les objets de la classe. De ce fait, il est impossible de linitialiser dans un constructeur de la classe, car le constructeur initialise les donnes des nouveaux objets et une donne statique nen est pas une. Pour rendre un attribut statique, il suffit de prcder sa dclaration du mot cl static. L'initialisation dune donne membre statique se fait lors de sa dfinition, qui a lieu en dehors de la dclaration de la classe. Syntaxe dinitialisation : <type> <nom_classe>:: <nom_variable> = <valeur>;
Exemple : class Essai { static int a; //ceci est un attribut static int b; // ceci est un attribut des objets de la classe }; int Essai::a=8; //initialisation de lattribut static

Notion de Classe
Fonction membre statique Une fonction membre statique est une fonction membre qui na accs quaux membres statiques dune classe. En effet, tant statique, elle ne peut pas tre invoque sur un objet dune classe et ne peut donc pas utiliser le pointeur this, comme c'est le cas pour les autres fonctions membres, pour accder aux attributs dun objet. Exemple :
class Essai { static int a; //ceci est un attribut static int b; // ceci est un attribut des objets de la classe public: static int getVal(); } int Essai::a=8; //initialisation de lattribut static static int Essai::getVal(){ a++; //correct b +=2; //impossible car la mthode ne peut accder b (Erreur) }

Notion de Classe
Membres Constants
On distingue les donnes membres (attributs) statiques et les fonctions membres (mthodes) statiques. Donne membre constante Une donne membre constante est un attribut constant. La dclaration dun attribut constant se fait comme on dclare toute variable constante laide du mot cl const la diffrence que linitialisation nest pas faite dans la classe mais au niveau du constructeur et avant laccolade ouvrante du constricteur.
class Essai { const int id; int a; public: Essai (int, int); }; Essai ::Essai(int val, int cst):id(cst) { a=val; }

Notion de Classe
Fonction membre constante
De mme quon peut avoir des attributs constants ou tout simplement des variables constantes, il est possible davoir des objets constants, donc non modifiables une fois crs. Invoquer nimporte quelle mthode sur ces objets pose problme. Lobjet ne sait pas si la mthode va tenter de modifier ou pas ses attributs. Pour quune mthode puisse tre voque sur un objet constant, elle doit tre dclare en ajoutant le mot cl const la fin de sa dclaration.
class Essai { const int id; int a; public: Essai (int, int); void afficher() const; }; Essai ::Essai(int val, int cst):id(cst) { a=val; } void Essai :: afficher() const { cout << v <<" "<< u <<endl; }

On pourra alors dans le programme principal faire :


const Essai A(5, 9); A.afficher();

Constructeur et Destructeur
Constructeur
Un constructeur est une mthode dune classe qui sexcute automatiquement la cration dun objet et seulement en ce moment. Cest dailleurs la toute premire mthode qui sexcute sur lobjet juste sa cration. Un constructeur permet donc dinitialiser un objet sa cration. Quelques caractristiques Cest une mthode (fonction membre de la classe); il na pas de type de retour. Mme pas void ; il porte le mme nom que la classe; Une classe peut avoir plusieurs types de constructeurs (constructeur par dfaut, constructeur de recopie, etc.)
class Nom_Classe { //Liste des attributs public: Nom_Classe(); // constructeur par dfaut Nom_Classe(const Nom_Classe &); // constructeur par copie Nom_Classe( Liste_paramtres); // constructeur //les autres mthodes de la classe }; Nota: le dtail de chaque type de constructeur sera abord en classe au cours,

Constructeur et Destructeur
Destructeur
A loppos dun constructeur, un destructeur est une mthode dune classe qui sexcute juste avant la fin de la vie dun objet . Un destructeur permet donc de faire le mnage juste avant la mort (destruction) dun objet. Cela permet de librer ou de fermer par exemple des ressources utilises. Quelques caractristiques Cest une mthode (fonction membre de la classe); il na pas de type de retour. Mme pas void ; il porte le mme nom que la classe mais prcd de symbole ~ (tilde); Une classe ne peut avoir quun seul destructeur et il ne prend aucun paramtre.
class Nom_Classe { //Liste des attributs public: ~Nom_Classe(); // constructeur par dfaut //les autres mthodes de la classe }; Nota: le dtail de chaque type de constructeur sera abord en classe au cours,

Fonctions et classe Amie


Fonction amie
Il est parfois ncessaire d'avoir des fonctions qui ne sont pas membres dune classe mais qui ont un accs direct aux champs de cette classe. On appelle de telles fonctions, des fonctions amies la classe. Pour rendre une fonction amie une classe, il faut qu'elle soit dclare dans la classe avec le mot-cl friend qui prcde sa dclaration classique.
class Essai { const int id; int a; friend void affiche_obj(const Essai & ); public: Essai (int, int); void afficher() const; }; void affiche_obj(const Essai & DD) { cout << DD.v <<" } "<< DD.u <<endl;

Nota :
Une fonction dune classe peut tre amie une autre classe. Dans ce cas, il faut prciser son nom complet laide de loprateur de rsolution de porte.

Fonctions et classe Amie


Classe amie
Pour rendre toutes les mthodes d'une classe amies une autre classe, il suffit de dclarer la premire classe comme amie la seconde. Ici aussi on utilise le mot cl friend avant la dclaration de la classe, l'intrieur de la classe cible. class B{ //attributs ... //mthodes }; class A{ const int id; int a; friend class B; //Toutes les mthodes B sont amies A; public: Essai (int, int); void afficher() const; };

re 1

liste dexercices

Exercice 1 1. crire une classe nomme Carac, permettant la gestion dun caractre alphabtique. Elle disposera : a) dun attribut de type caractre b) dun constructeur un paramtre, permettant dinitialiser lattribut de chaque instance (de la classe) sa cration avec une valeur voulue ; c) dun constructeur sans paramtre qui attribuera par dfaut le caractre espace au champ de tout objet sa cration, si aucun paramtre nest pass; d) dune mthode nomme estVoyelle retournant la valeur vrai lorsque le caractre concern est une voyelle et la valeur faux dans le cas contraire. Proposer un constructeur qui prend en compte la fois le b) et le c). Exercice 2 On dsire crer une classe Cercle pour manipuler les cercles. Un cercle est caractris par les coordonnes de son centre et son rayon. Les oprations ralisables sur un cercle sont les suivantes : Crer un objet cercle Changer les coordonnes dun cercle Changer le rayon dun cercle Afficher les coordonnes dun cercle Calculer la distance dun cercle un autre dans le plan. Il sagit de la distance entre les centres des deux cercles. Calculer la surface dun cercle Proposer une classe avec les attributs et mthodes permettant de mettre en uvre cette classe. Proposer un programme principal simulant le fonctionnement de cette classe en crant des instances et en invoquant sur elles les diffrentes mthodes identifies.

re 1

liste dexercices

Exercice 3 Une interface rseau (carte dinterface) est constitue de composants (matriels et logiciels) dont la fonction principale est de permettre lordinateur de communiquer par le biais dune ou de plusieurs technologies de mise en rseau. On veut crer une classe de gestion dinterface rseau. Une interface rseau dans notre contexte aura comme caractristiques : Une adresse MAC qui est unique et qui sera reprsente par une chaine de caractres Un dbit maximal, qui est une valeur numrique et qui peut varier dune carte lautre Une marque, qui est une chaine de caractre Un tat, qui est soit activ ou soit dsactiv a) b) Proposer une classe pour la modlisation dinterface rseau Ajouter cette classe les mthodes ncessaire pour la prise en compte des situations ci-dessous : - Afficher toutes les caractristiques dun objet interface - Activer ou dsactiver une carte dinterface (une seule mthode fait les deux choses) - Connaitre ltat dune carte dinterface (activ, dsactiv) - Connaitre le nombre total dinstance de carte dinterface cr