Introduction à la Programmation Orientée Objet et au C++ Concepts et exemples
Plan Notions de programmation de base Classes et Objets Les fonctions amies La surdéfinition d op ateu s Les patrons de fonctions et de classes La te h i ue de l h itage Les espaces de nommage Application - Code de calcul Simula+ Discussion
Notions de Programmation de Base
1 octet = 8 bits 1 bit = 0 ou 1 1. Les variables système Type de donnée Signification Taille (en octets) Plage de valeurs acceptée char Caractère 1-128 à 127 unsigned char Caractère non signé 1 0 à 255 short int Entier court 2-32 768 à 32 767 unsigned short int Entier court non signé int Entier unsigned int Entier non signé 2 2 (sur processeur 16 bits) 4 (sur processeur 32 bits) 2 (sur processeur 16 bits) 4 (sur processeur 32 bits) 0 à 65 535-32 768 à 32 767-2 147 483 648 à 2 147 483 647 0 à 65 535 0 à 4 294 967 295 long int Entier long 4-2 147 483 648 à 2 147 483 647 unsigned long int Entier long non signé 4 0 à 4 294 967 295 float Flottant (réel) 4-3.4*10-38 à 3.4*1038 double Flottant double 8-1.7*10-308 à 1.7*10308 long double Flottant double long 10-3.4*10-4932 à 3.4*104932 Même taille que le type int, parfois 1 sur quelques compilateurs Prend deux valeurs : 'true' et 'false' mais une conversion implicite (valant 0 ou 1) est faite par le compilateur lorsque l'on affecte un entier (en réalité toute autre valeur que 0 est considérée comme égale à True). bool Booléen
2. Les boucles But : effectuer plusieurs fois le e type d op ratio s Ex: sommer les 10 premiers entiers Attention : en C++ il faut initialiser les variables, sinon une valeur aléatoire est attribuée for (int i=0; i<10; i++) type du compteur Incrémente le compteur de 1 initialisation du compteur reste dans la boucle tant que cette condition est vérifiée
3. Les fonctions But : accomplir une tâche int double float Fonction INPUTS Atte tio : u e fo tio OUTPUT e peut e o e u u seul t pe Fonction standard : float fctname (int, double) Fonction sans argument : float fctname () Fonction sans valeur de retour : void fctname (int, double) Remarque : une fonction bien programmée peut être lue sur 1 seul écran
Transmission de variable Il existe 3 façons de transmettre des variables à une fonction : - transmission par valeur n adresse a adresse valeur valeur les valeurs de n et p sont dupliquées on change les valeurs des copies - transmission par adresse n adresse a valeur les valeurs de n et p ne sont pas dupliquées on change les valeurs des originaux - transmission par référence la simplicité de la notation de la transmission par valeur le mécanisme de la transmission par adresse
4. Surdéfinition de fonctions une fonction avec un même nom possède plusieurs significations sosie numero 1 : a = 5 sosie numero 2 : a = 2.5 Que se passe t il si x est de type float, long dou le,? conversion du type par le compilateur
7. L allo atio d a i ue de oi e l op ateu NEW se t à alloue de la l op ateu DELETE se t à li oi e e de la oi e L op ateu NEW Exemple 1 Exemple 2 Pou alloue l e ts d u «type» donné : new type [n] new retourne un pointeur (type*) sur le 1er l p adresse adresse adresse adresse adresse valeur valeur valeur valeur valeur p[0] p[4] e t d u ta leau
L op ateu DELETE li e la o do oi e allou e pa l op ateu NEW e o e a gu e t l ad esse du poi teu fou ie pa e syntaxe pour les éléments de type C++ standard int* p; p = new int [5]; delete p; Atte tio le rôle de l op rateur delete est tr s i porta t. Si on détruit un pointeur sans libérer correctement la mémoire, celle-ci est plus accessible et ne peut être réallouée Stack overflow
Classes et Objets
Objectif Variables standart du C++ double a, b, s, p; a= 5; b = 7; s = a + b; p = a * b;
Objectif Variables standart du C++ double a, b, s, p; a= 5; b = 7; s = a + b; p = a * b; D fi i de ou eau t pes de a ia les : e teu s, at i e, te seu s, double p; vector u (4), v(4), w(4); u[1]=5; u[2]=3; u[3]=-1; u[4]=7; v[1]=0.4; v[2]=7; v[3]=-1.2; v[4]=0.75 w = u + v; p = u * v;
1. Classes et encapsulation des données Classe généralisation de la notion de type e te sio des t pes C++ sta da d à de ou eau t pes d fi is pas l utilisateu regroupe des données et des méthodes données membres fonctions membres On a séparé les données et fonctions membres en 2 catégories public private
Encapsulation p i ate : do es et thodes o a essi les à l e t ieu de la lasse seules les fonctions membres y ont accès p ote ted : do es et thodes o a essi les à l e t ieu de la lasse accès possible par les classes dérivées (cf plus tard) pu li : do es et thodes a essi les à l e t ieu de la lasse Remarques pour modifier des données privées il faut passer via des méthodes publiques En POO pure, les données sont encapsulées et leur accès ne peut se faire que par le biais de méthodes
Définition des fonctions membres (méthodes) initialise méthode de point x et y modifiables le symbole :: est un opérateur de résolution de portée l ide tifi ateu initialise est celui défini dans la classe point
Utilisation de la classe Remarques poi t est u ou eau t pe d fi i pa l utilisateu a et b sont des instances de la classe point a et b sont encore appelés des objets de type point si au u des ots p i ate ou pu li appa aît da s la lasse, tout est o sid o e ta t p i ate => ie est a essi le
2. Constructeur et destructeur atio d u ou el o jet allocation de mémoire Processus automatisé CONSTRUCTEUR initialisation de ses données Fonctions membres appelées automatiquement à ha ue atio / dest u tio d o jet dest u tio d u o jet libération de mémoire Processus automatisé DESTRUCTEUR
Résultat: affiche 10 valeurs aléatoires Exemple
3. E ploitatio d u e lasse Disso ie l i pl e tatio d u e lasse de so utilisatio Mettre dans un fichier séparé la classe et son implémentation C atio de i lioth ues ue l o eg oupe pa th es 4. Propriétés des fonctions membres Surdéfinition des fonctions membres La surdéfinition de fonctions «ordinaires» e C++ s appli ue au fonctions membre d u e lasse, o p is au constructeur Elle e peut s appli ue au dest u teu ui e eçoit au u a gu e t
Exemple
Les o jets t a s is e a gu e t d u e fo tio e e Exemple définir une méthode «coincide» dans la classe point pour comparer 2 objets de type point so appel s effe tue de la a i e sui a te a.coincide (b) ou par symétrie du problème b.coincide (a) - transmission par valeur - transmission par adresse - transmission par référence
Résultat a et b 0 (false) b et c 1 (true)
Les fonctions amies
POO pure Encapsulation des données données membres privées accessibles seulement par les méthodes publiques de la classe u e thode d u e aut e lasse doit passe ia les méthodes publiques de la classe pour accéder aux données privées problème dans certains cas Exemple On définit une classe vector et une classe matrix. Produit matrice- e teu essite l a s au do es p i es des 2 lasses
Il e iste plusieu s situatio s d a iti fo tio i d pe da te a ie d u e lasse fo tio e e d u e lasse et a ie d u e aut e lasse fonction amie de plusieurs classes toutes les fo tio s e e d u e lasse, a ies d u e aut e lasse Fo tio i d pe da te a ie d u e lasse Une fonction amie se déclare avec le mot clé friend Exemple
Résultat a et b coincident a et c ne coincident pas
La su d fi itio d op ateu s
On considère une classe vector 2D : class vector { int x,y; }; On définit 2 objets de type vector a et b b a Peut on écrire comme pour un type standard C++ la somme a + b?
Il faut surd fi ir l op rateur + pour la classe définir une fonction operator + au sein de la classe utiliser le mot clé operator sui i de l op ateu à su d fi i la fonction operator + peut être : soit une fonction membre de la classe soit une fonction indépendante amie de la classe soit une fonction indépendante de la classe Afi de p ot ge les do su d fi i l op ateu o es et d a l e le ode, o hoisit e g al de e fo tio i d pe da te a ie de la lasse.
Surdéfinition d op ateu a e u e fo tio a ie Résultat coordonnees (1,2) coordonnees (2,5) coordonnees (3,7) coordonnees (6,14)
Surdéfinition d op ateu a e u e fo tio e e Résultat identique
Remarques la fonction operator + est appelé de la manière suivante : fontion indépendante : a + b operator + (a,b) fontion membre : a + b a.operator + (b) la fonction membre operator + fait apparaître une dissymétrie et l o jet a e peut pas t e p ot g Opérateurs et transmission par référence Dans les deux exemples précédents, on utilise la transmission par valeur Pour des objets de grande taille, il vaut mieux utiliser la transmission par f e e. O peut alo s p ot ge les o jets t a s is a e o st point operator + (const point& a, const point&b) Le etou de l o jet poi t se fait obligatoirement par valeur
Surdéfinition de l op ateu [ ] exemple de la classe vector l op ateu [ ] pe et d a de au ième élément du vecteur En informatique on commence à compter à partir de 0 En mathématiques on commence à compter à partir de 1 C est l op ateu [ ] ui fe a la o e sio C++ i pose de d fi i l op ateu [ ] o e fonction membre int& operator [ ] (int); retour par référence o ligatoi e afi d utilise l op ateu pou affe te des valeurs
Les patrons de fonctions Les patrons de classes
La surdéfinition de fonctions permet de donner un nom unique à plusieurs fonctions réalisant un travail différent La notion de patron est plus puissante et plus restrictive Plus puissante o it u e seule fois la d fi itio d u e fo tio pou ue le o pilateu puisse l adapte auto ati ue e t à i po te uel t pe Plus restrictive toutes les fonctions ainsi fabriquées ont la même définition et le même algorithme But écrire une fonction qui soit valable quel que soit le type des arguments utilisés
Exemple int min (int a, int b) { return (a < b)? a : b; } double min (double a, double b) { return (a < b)? a : b; } float min (float a, float b) { return (a < b)? a : b; } long int min (long int a, long int b) { return (a < b)? a : b; } et On écrit la même fonction pour tous les types existant en C++ est lo g, t s lo g, t s t s lo g et en plus il faut le faire pour toutes les fonctions ça multiplie les lignes de code et rend le code illisible il faut compléter le code quand on définit ses propres classes
On résout ce problème en utilisant les patrons de fonctions cette méthode est très puissante Elle pe et de d fi i des thodes pou des t pes ui e iste t pas e o e fonction patron Résultat type min (n,p) = 4 min (x,y) = 2.5
Surdéfinition des patrons Remarque o peut t a s ett e des l grâce aux patrons e ts de les fo tio s su d fi ies doi e t a oi u d ite les a igüit s i po te uel t pe au fo tio s o e d a gu e ts diff e t afi
Les patrons de classes Mise en évidence du problème Comment stocker des points avec des coordonnées int, float, dou le,? Utiliser des patrons de classe
Les patrons de patrons Exemple d appli atio à la mécanique: Loi de comportement : Σ = C :: E
Les patrons de patrons Exemple d appli atio à la mécanique: Loi de comportement : Σ = C :: E Tenseurs d o d e 2 : Σ, E Tenseur d o d e 4 : C (tenseur d lasti it ) C isotrope => 2 constantes d lasti it (Lamé)
Les patrons de patrons Exemple d appli atio à la mécanique: Loi de comportement : Σ = C :: E Tenseurs d o d e 2 : Σ, E Tenseur d o d e 4 : C (tenseur d lasti it ) C isotrope => 2 constantes d lasti it (Lamé) E C INPUTS Loi de comportement Fonction Σ OUTPUT
Les patrons de patrons Exemple d appli atio à la mécanique: Loi de comportement : Σ = C :: E Tenseurs d o d e 2 : Σ, E Tenseur d o d e 4 : C (tenseur d lasti it ) C isotrope => 2 constantes d lasti it (Lamé) E C INPUTS Loi de comportement Fonction Σ OUTPUT C: utilisation d u pat o pou sto ke les constantes d lasti it
E C INPUTS Loi de comportement Fonction Σ OUTPUT C: utilisation d u pat o pou sto ke les constantes d lasti it C -> cubique (3 constantes élasticté) Tenseurs d o d e 2 : Σ, E Tenseur cubique : C (tenseur d lasti it ) Comment ne pas réécrire le code de la loi de comportement dans ce nouveau cas?
E C INPUTS Loi de comportement Fonction Σ OUTPUT C: utilisation d u pat o pou sto ke les constantes d lasti it C -> cubique (3 constantes élasticté) Tenseurs d o d e 2 : Σ, E Tenseur cubique : C (tenseur d lasti it ) Comment ne pas réécrire le code de la loi de comportement dans ce nouveau cas? utiliser un patron pour C C utilise déjà un patron pour stocker les constantes d lasti it => utilisation d u pat o de pat o
Avantage : La loi de comportement reste valable même pour des objets non encore définis Ex. On pourra définir plus tard un classe pour l lasti it orthotrope et utiliser la même loi de comportement sans changer le code gérant cette loi.
La te h i ue de l h itage
Le o ept de l h itage ou de lasses d i es o stitue l u des fondements de la POO Intérêt Classe dérivée : nouvelle classe classe de base définie à partir de la classe de base propriétés de la classe hérite des propriétés de la classe de base ajoute de nouvelles propriétés à la classe de base ne modifie pas la classe de base classe dérivée propriétés classe de base + nouvelles propriétés permet de développer de nouveaux outils en se basant sur les acquis de la classe de base
Remarque L h itage est pas li it à u seul i eau une classe dérivée peut devenir classe de base pour une autre classe plusieu s lasses peu e t t e d i es d u e e lasse
Mise e œu e de l h itage Classe de base
On ajoute une information à cette classe : la couleur du point Classe dérivée Programme principal
Utilisatio des dérivée e es d u e lasse de ase da s u e lasse Quand on appelle p.affiche() pour un objet de type pointcol, cette fonction est pas d fi ie da s la lasse e fa t poi t ol C est la fo tio affi he de la lasse pa e t poi t ui est appel e C est la fo tio affi he de la lasse pa e t poi t ui est appel e
Utilisation pa tie o u edu p o l e classe de base dérivée 1 dérivée 2 dérivée 3 dérivée 4 solution 1 solution 2 solution 3 solution 4 gain de temps en programmation pas de pénalité de temps pour les fonctions non utilisées dans la classe dérivée, car non i lues lo s de l ditio de lie pe te de te ps lo s d appel de fo tio s i i u es
Les espaces de nommage
Mot clé : namespace zones de déclaration permettant de délimiter la recherche des noms des identificateurs par le compilateur But regrouper les identificateurs logiquement pour éviter les conflits de nom e t e plusieu s pa ties d u e p ojet Remarque par défaut, C++ utilise un espace de nommage (namespace std) de portée globale dans lequel il doit y avoir aucun conflit de nom D fi itio d u espa e de o age
Exemple de projet
MOL++ MateriOL++ simula+ MPISOL++ PMOL++ materials MOL++ MateriOL++ MPISOL++ PMOL++ materials tests gui doc
définition de la classe vector
Méthodes de la classe vector
Utilisation de la classe vector
Documentation en ligne & héritage
Références P se tatio t l ha gea le à l ad esse : http://www.lpmm.univ-metz.fr/collard/doc/introduction a la POO.pdf Cours complet téléchargeable à l ad esse : http://www.lpmm.univ-metz.fr/collard/doc/programmation Orientee objet et C++.v1.pdf