Génie Logiciel I. Nicolas Kielbasiewicz C.D.C.S.P./I.S.T.I.L./I.C.J. Filière M.A.M. 2ème année - 08/09

Documents pareils
C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

Premiers Pas en Programmation Objet : les Classes et les Objets

Génie Logiciel I. Cours VI - Typage statique / dynamique, fonctions virtuelles et classes abstraites, flots d entrées / sorties, et string

Plan Pédagogique du cours

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Introduction à l héritage en C++

et Programmation Objet

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

Cours 1: Java et les objets

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Bases de programmation. Cours 5. Structurer les données

Programmation par les Objets en Java

Chapitre 2. Classes et objets

Héritage presque multiple en Java (1/2)

Claude Delannoy. 3 e édition C++

Java Licence Professionnelle CISII,

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Une introduction à Java

Cours d initiation à la programmation en C++ Johann Cuenin

Programme Compte bancaire (code)

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Chapitre VI- La validation de la composition.

Introduction au langage C

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

as Architecture des Systèmes d Information

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Traduction des Langages : Le Compilateur Micro Java

I. Introduction aux fonctions : les fonctions standards

Le prototype de la fonction main()

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Cours d Algorithmique et de Langage C v 3.0

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

PROGRAMMATION PAR OBJETS

Utilisation d objets : String et ArrayList

Généralités sur le Langage Java et éléments syntaxiques.

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Programmer en JAVA. par Tama

Programmation C. J.-F. Lalande. 15 novembre 2012

INITIATION AU LANGAGE JAVA

Chapitre 1 : La gestion dynamique de la mémoire

ALGORITHMIQUE ET PROGRAMMATION ORIENTEE OBJET

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Introduction à C++ et à wxwidgets

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Programmation système I Les entrées/sorties

Objets et Programmation. origine des langages orientés-objet

Le langage C. Séance n 4

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

1.6- Génération de nombres aléatoires

Plan du cours. Historique du langage Nouveautés de Java 7

Corrigés des premiers exercices sur les classes

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Programmation C++ (débutant)/instructions for, while et do...while

Argument-fetching dataflow machine de G.R. Gao et J.B. Dennis (McGill, 1988) = machine dataflow sans flux de données

Programmation en C/C++

Algorithmique et Programmation, IMA

Java c est quoi? Java pourquoi?

TP, première séquence d exercices.

Programmation Orientée Objet application au langage Java Version Novembre 2007

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Architecture des ordinateurs

Programmation système en C/C++

Programmation C. Apprendre à développer des programmes simples dans le langage C

Rappels Entrées -Sorties

Principes des langages de programmation INF 321. Eric Goubault

OS Réseaux et Programmation Système - C5

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Chap III : Les tableaux

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Facultés Universitaires Notre-Dame de la Paix. Conception et Programmation Orientées- Object

Chapitre 10. Les interfaces Comparable et Comparator 1

INFO-F-105 Language de programmation I Séance VI

Programmation en Java IUT GEII (MC-II1) 1


RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

RMI le langage Java XII-1 JMF

Gestion d identités PSL Exploitation IdP Authentic

Généralités. javadoc. Format des commentaires. Format des commentaires. Caractères spéciaux. Insérer du code

Java DataBaseConnectivity

TD3: tableaux avancées, première classe et chaînes

Tp 1 correction. Structures de données (IF2)


Langage Java. Classe de première SI

Création d objet imbriqué sous PowerShell.

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Chapitre 5 : Les procédures stockées PL/SQL

Transcription:

Génie Logiciel I Cours II - Propriétés des éléments d une classe, généricité Nicolas Kielbasiewicz C.D.C.S.P./I.S.T.I.L./I.C.J. Filière M.A.M. 2ème année - 08/09 Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 1 / 56 Plan du cours 1 Variables, attributs et méthodes constants 2 Attributs et méthodes statiques 3 Fonctions, méthodes et classes amies 4 La généricité Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 2 / 56

Variables constantes Définition Definition (const) Le qualificatif const permet de spécifier qu un symbole correspond à quelque chose dont la valeur ne doit pas changer. Utilité : permettre au compilateur de signaler les tentatives de modification de ce symbole. i n t main ( i n t argc, char argv [ ] ) { const i n t n=5; n=3; // r e j e t à l a c o m p i l a t i o n Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 3 / 56 Variables constantes C vs C++ Variables locales : pas de différences entre C et C++ : la portée du symbole est limitée au bloc ou à la fonction concernée, comme la portée de la variable elle-même; Variables globales : contrairement au C, C++ limite la portée du symbole au fichier source contenant la déclaration. Cela permet de remplacer certaines instructions C de la forme #define... C fichier 1 #define N = 3 fichier 2 #define N = 5 Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 4 / 56

Variables constantes C vs C++ Variables locales : pas de différences entre C et C++ : la portée du symbole est limitée au bloc ou à la fonction concernée, comme la portée de la variable elle-même; Variables globales : contrairement au C, C++ limite la portée du symbole au fichier source contenant la déclaration. Cela permet de remplacer certaines instructions C de la forme #define... C++ fichier 1 const i n t N = 3 ; fichier 2 const i n t N = 5 ; Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 5 / 56 Variables constantes C vs C++ Variables locales : pas de différences entre C et C++ : la portée du symbole est limitée au bloc ou à la fonction concernée, comme la portée de la variable elle-même; Variables globales : contrairement au C, C++ limite la portée du symbole au fichier source contenant la déclaration. Cela permet de remplacer certaines instructions C de la forme #define...; Les expression : contrairement au C, en C++, une expression, par exemple 2*p+5, est constante si p est une variable constante. Utilité : Lors d une déclaration de tableau, l argument spécifiant la taille est un entier constant. C++ autorise donc l utilisation d expressions pour déclarer des tableaux. const i n t ne1 = 1 5 ; double t1 [ ne1 +1], t2 [ 2 ne1 ] [ ne1 ] ; // a u t o r i s é en C++ Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 6 / 56

Variables constantes Pointeur constant Definition (Pointeur constant) Un pointeur constant est un pointeur qui ne peut changer de valeur, c est-à-dire dont l adresse ne peut être modifiée. i n t main ( i n t argc, char argv [ ] ) { i n t x = 2 ; i n t y =3; i n t const px = &x ; px = &y ; // r e j e t à l a c o m p i l a t i o n Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 7 / 56 Variables constantes Pointeur sur constante Definition (Pointeur sur constante) Un pointeur sur constante pointe sur une variable constante. On ne peut donc modifier son contenu. i n t main ( i n t argc, char argv [ ] ) { i n t x = 2 ; const i n t px = &x ; px = 4 ; // r e j e t à l a c o m p i l a t i o n Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 8 / 56

Variables constantes Pointeur sur constante Pour modifier le contenu d un pointeur sur constante, on peut utiliser la recopie vers un autre pointeur : i n t main ( ) { i n t x = 2 ; const i n t px = &x ; i n t py ; py = ( i n t ) px ; // r e c o p i e avec c o n v e r s i o n py = 4 ; // a c c è s pour m o d i f i c a t i o n à l i n f o p o i n t é e Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 9 / 56 Attributs constants Définition et syntaxe Definition (Attribut constant) Un attribut constant est un attribut dont on veut fixer la valeur une fois pour toutes. c l a s s Truc { const i n t x ; f l o a t y ; p u b l i c : Truc ( i n t i, i n t j ) : x ( i ) { y=j ; // i n i t i a l i s a t i o n void f ( i n t a ) { x = a ; // r e j e t à l a c o m p i l a t i o n ; L attribut constant x est évalué à priori en faisant appel au constructeur de la classe int. Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 10 / 56

Fonctions membres et qualificatif const Arguments constants d une fonction membre Tous comme des variables classiques, des arguments constants ne peuvent être modifiés dans une méthode. L appel d une telle méthode n impose pas que les variables passées en argument soient constantes. : le constructeur par copie c l a s s p o i n t { i n t x, y ; p o i n t : : p o i n t ( const p o i n t & s o u r c e ) { x=s o u r c e. x ; y=s o u r c e. y ; ; i n t main ( i n t argc, char argv [ ] ) { p o i n t a ; p o i n t b=a ; Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 11 / 56 Fonctions membres et qualificatif const Arguments constants d une fonction membre Un variable constante ne peut être passée en argument d une méthode que si cet argument est déclaré constant : c l a s s p o i n t { i n t x, y ; void e v a l ( i n t s o u r c e ) ; ; i n t main ( i n t argc, char argv [ ] ) { p o i n t a ; const i n t n=3; a. e v a l ( n ) ; // r e j e t à l a c o m p i l a t i o n Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 12 / 56

Fonctions membres et qualificatif const Valeurs de retour constantes Une fonction membre, et plus généralement une fonction, peut retourner une valeur constante : c l a s s p o i n t { i n t x, y ; const i n t e v a l ( i n t s o u r c e ) ; ; i n t main ( i n t argc, char argv [ ] ) { p o i n t a ; i n t n=3; const i n t m=a. e v a l ( n ) ; Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 13 / 56 Fonctions membres et qualificatif const Fonctions membres constantes 1 Une fonction membre constante peut être utilisée sur un objet constant; 2 Les instructions figurant dans la définition de la fonction ne doivent pas modifier la valeur des membres de l objet. c l a s s p o i n t { i n t x, y ; void a f f i c h e ( ) const ; ; i n t main ( i n t argc, char argv [ ] ) { const p o i n t a ; a. a f f i c h e ( ) ; Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 14 / 56

Attributs statiques Définition et syntaxe Plusieurs instances d une même classe possèdent généralement leurs propres attributs (aussi appelés membres données). Il est toutefois possible de permettre à ces instances de partager des données. Solution : utiliser le qualificatif static Definition (Attribut statique) Un attribut statique, aussi appelé attribut de classe, est une donnée qui sera commune à toutes les instances de sa classe. c l a s s expleun { i n t n, x ; ; expleun a, b ; a.n a.x objet a b.n b.x objet b Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 15 / 56 Attributs statiques Définition et syntaxe Plusieurs instances d une même classe possèdent généralement leurs propres attributs (aussi appelés membres données). Il est toutefois possible de permettre à ces instances de partager des données. Solution : utiliser le qualificatif static Definition (Attribut statique) Un attribut statique, aussi appelé attribut de classe, est une donnée qui sera commune à toutes les instances de sa classe. c l a s s expledeux { s t a t i c i n t n ; i n t x ; ; expledeux a, b ; a.x a.n objet a objet b b.n b.x Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 16 / 56

Attributs statiques Initialisation Les données statiques n existent par définition qu en un seul exemplaire. On ne peut donc les initialiser dans un constructeur. Idée c l a s s expledeux { s t a t i c i n t n=2; ; Cela donne une erreur de compilation. Pourquoi? Pour les mêmes raisons qu en C, une variable globale peut être déclarée plusieurs fois, mais elle ne peut être initialisée qu une seule fois. Une variable statique ne peut donc être initialisée qu en dehors de la déclaration de la classe. Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 17 / 56 Attributs statiques Initialisation Les données statiques n existent par définition qu en un seul exemplaire. On ne peut donc les initialiser dans un constructeur. Cela donne une erreur de compilation. Pourquoi? Pour les mêmes raisons qu en C, une variable globale peut être déclarée plusieurs fois, mais elle ne peut être initialisée qu une seule fois. Une variable statique ne peut donc être initialisée qu en dehors de la déclaration de la classe. Solution c l a s s expledeux { s t a t i c i n t n ; ; i n t expledeux : : n =2; Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 18 / 56

Attributs statiques constants Initialisation La restriction précédente ne concerne pas les attributs statiques constants. Il reste toutefois nécessaire de les déclarer à l extérieur pour provoquer la réservation de l emplacement mémoire. Solution c l a s s expledeux { s t a t i c const i n t n=2; ; i n t expledeux ; Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 19 / 56 Attributs statiques d utilisation Le compteur d instances #i n c l u d e <i o s t r e a m > u s i n g namespace s t d ; c l a s s c p t r O b j { s t a t i c i n t c p t r ; p u b l i c : c p t r O b j ( ) ; c p t r O b j ( ) ; ; i n t c p t r O b j : : c p t r =0; c p t r O b j : : c p t r O b j ( ) { cout << ++ c o n s t r u c t i o n : i l y a maintenant << ++c p t r << o b j e t s \n ; c p t r O b j : : c p t r O b j ( ) { cout << d e s t r u c t i o n : i l r e s t e maintenant << c p t r << o b j e t s \n ; i n t main ( i n t argc, char a r g v [ ] ) { v o i d f c t ( ) ; c p t r O b j a ; f c t ( ) ; c p t r O b j b ; v o i d f c t ( ) { c p t r O b j u, v ; Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 20 / 56

Fonctions membres statiques Définition Definition (Fonctions membres statiques) Une fonction membre statique est une fonction attachée à la classe : elle est indépendante des instances. La classe cptrobj c l a s s c p t r O b j { s t a t i c v o i d c p t r O b j : : compte ( ) ; ; v o i d c p t r O b j : : compte ( ) { cout << a p p e l compte : i l y a << c p t r << o b j e t s \n ; i n t main ( i n t argc, char a r g v [ ] ) { v o i d f c t ( ) ; c p t r O b j a ; c p t r O b j : : compte ( ) ; f c t ( ) ; c p t r O b j : : compte ( ) ; c p t r O b j b ; c p t r O b j : : compte ( ) ; Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 21 / 56 Fonctions membres statiques Définition Definition (Fonctions membres statiques) Une fonction membre statique est une fonction attachée à la classe : elle est indépendante des instances. les fonctions membres statiques ne peuvent agir que sur les variables statiques et appeler éventuellement d autres fonctions membres statiques; les fonctions membres statiques permettent de préparer le comportement d une classe en initialisation les arguments statiques; exemple typique de fonction membre statique : l opérateur surchargé new Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 22 / 56

Fonctions amies Problématique une fonction externe ne peut accéder aux attributs privés d une classe; une fonction membre d une classe ne peut accéder aux attributs privés d une classe. Comment lever cette interdiction quand c est nécessaire? 1 rendre publiques les attributs auxquels on veut accéder la notion de protection; on n utilise plus 2 utiliser les accesseurs (qui sont publiques par définition) associés à ces attributs pénalisation sur le temps d exécution; = = 3 utiliser un nouveau concept : l amitié. Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 23 / 56 Fonctions amies Les 4 cas d amitié une fonction externe, amie d une classe; une fonction membre d une classe, amie d une autre classe; une fonction, externe ou membre d une classe, amie de plusieurs classes; toutes les fonctions membres d une classe, amies d une autre classe. Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 24 / 56

Fonctions amies Fonctions externes amies d une classe : la fonction amie coincide de la classe point #i n c l u d e <i o s t r e a m > u s i n g namespace s t d ; c l a s s p o i n t { i n t x, y ; p u b l i c : p o i n t : : p o i n t ( i n t abs =0, i n t ord =0) { x=abs ; y=ord ; f r i e n d i n t c o i n c i d e ( p o i n t, p o i n t ) ; ; i n t c o i n c i d e ( p o i n t p, p o i n t q ) { i f ( ( p. x == q. x ) && ( p. y == q. y ) ) r e t u r n 1 ; e l s e r e t u r n 0 ; i n t main ( i n t argc, char a r g v [ ] ) { p o i n t a ( 1, 0 ), b ( 1 ) c ; i f ( c o i n c i d e ( a, b ) ) cout << a c o i n c i d e avec b << e n d l ; e l s e cout << a e t b s o n t d i f f é r e n t s << e n d l ; i f ( c o i n c i d e ( a, c ) ) cout << a c o i n c i d e avec c << e n d l ; e l s e cout << a e t c s o n t d i f f é r e n t s << e n d l ; Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 25 / 56 Fonctions amies Fonctions externes amies d une classe l emplacement de la déclaration d amitié est absolument indifférent : une fonction amie n est pas une fonction membre. La définir comme publique ou privée n a donc aucune signification; inutile de déclarer la notion d amitié dans la fonction ou dans le fichier source, car elle est déjà déclarée dans la classe concernée; pas d argument implicite this. La fonction coincide est parfaitement symétrique; par définition, une fonction amie d une classe aura un ou plusieurs arguments ou une valeur de retour du type de la classe; si une fonction amie d une classe retourne une valeur du type de la classe, il s agit nécessairement d un passage par valeur. Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 26 / 56

Fonctions amies Fonctions membres d une classe, amies d une autre classe c l a s s A { // p a r t i e p r i v é e // p a r t i e p u b l i q u e f r i e n d i n t B : : f ( char, A ) ; ; c l a s s B { i n t B : : f ( char, A) ; ; i n t B : : f ( char s t r, A o b j ) { // a c c è s aux é l é m e n t s p r i v é s de t o u t o b j e t de type A Comment ça se passe au niveau de la compilation? Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 27 / 56 Fonctions amies Fonctions membres d une classe, amies d une autre classe pour compiler correctement les déclarations de la classe A, le compilateur a besoin de connaître les caractéristiques de B la déclaration de B devra être compilée avant celle de A; pour compiler correctement les déclarations de la classe B, le compilateur n a pas besoin de connaître précisément les caractéristiques de A. Il lui suffit juste de savoir qu il s agit d une classe. La classe B sera donc modifiée de la façon suivante : La classe B modifiée c l a s s A ; c l a s s B { i n t B : : f ( char, A) ; ; = Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 28 / 56

Fonctions amies Fonctions amies de plusieurs classes c l a s s B ; c l a s s A { // p a r t i e p r i v é e // p a r t i e p u b l i q u e f r i e n d v o i d f (A, B) ; ; c l a s s A ; c l a s s B { // p a r t i e p r i v é e // p a r t i e p u b l i q u e f r i e n d v o i d f (A, B) ; ; v o i d f (A obja, B objb ) { // a c c è s aux é l é m e n t s p r i v é s de t o u t o b j e t de t y p e A ou B Même remarque concernant la compilation. Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 29 / 56 Fonctions amies Classes amies Si l on veut que toutes les fonctions membres de la classe B soient amies de la classe A, alors on dit que B est une classe amie de A : c l a s s B ; c l a s s A { // p a r t i e p r i v é e // p a r t i e p u b l i q u e f r i e n d c l a s s B ; ; même remarque concernant la compilation; ce type de déclaration évite d avoir à fournir les en-têtes des fonctions concernées. Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 30 / 56

Fonctions amies Généralités sur la compilation les classes sont généralement compilées séparément. Leur utilisation se fait par un module objet (le fichier.o) contenant leurs fonctions membres et d un fichier d en-tête contenant leurs déclarations; la compilation séparée garantit l un des 4 principes fondamentaux: la réutilisabilité; si on utilise des fonctions indépendantes déclarées amies d une classe, on peut vouloir le compiler dans un module objet séparé l utilisateur peut délibéremment violer le principe d encapsulation, en fournissant lui-même une autre fonction de même en-tête en remplacement, accédant ainsi librement aux attributs privés. = Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 31 / 56 La généricité Problématique la surcharge de fonctions, ou surdéfinition de fonctions, est un mécanisme qui permet de donner un nom unique à plusieurs fonctions réalisant un travail différent; le concept de généricité vise de son coté à définir une fois pour toutes une fonction de sorte que le compilateur puisse automatiquement l adapter à n importe quel type. On parle de fonction générique, ou modèle de fonction ou patron de fonction 1. Contrainte : Les fonctions génériques imposent un comportement identique quel que soit le type de données manipulées. Il s agit donc de la même définition, donc du même algorithme. 1 «patron» se dit «template» en anglais. Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 32 / 56

= La généricité Un exemple La fonction min i n t min ( i n t a, i n t b ){ i f ( a < b ) return a ; e l s e return b ; f l o a t min ( f l o a t a, f l o a t b ){ return a < b? a : b ; // même s i g n i f i c a t i o n La fonction min générique template <c l a s s T> T min (T a, T b ){ return a < b? a : b ; Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 33 / 56 La généricité Un exemple Utilisation #i n c l u d e <i o s t r e a m > u s i n g namespace s t d ; template <c l a s s T> T min (T a, T b ){ r e t u r n a < b? a : b ; i n t main ( i n t argc, char a r g v [ ] ) { i n t n=4, p=12; f l o a t x =2.5, y =3.25; char a = m o n s i e u r, b = b o n j o u r ; cout << min ( n, p ) = << min ( n, p ) << e n d l ; cout << min ( x, y ) = << min ( x, y ) << e n d l ; cout << min ( a, b ) = << min ( a, b ) << e n d l ; Pour des instances d une classe, il faut que la notion d ordre existe d opérateurs (CM3). surcharge Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 34 / 56

La généricité Comment ça marche? pour utiliser le patron de fonction min que nous avons créé, il suffit de l utiliser dans les conditions appropriées, ici 2 arguments de même type, la notion d ordre étant (re)définie pour ce type; à l exécution du programme et de l appel du patron sur des entiers, le compilateur fabrique, ou instancie, automatiquement la fonction min avec des arguments de type int. Le résultat de cette fabrication s appelle fonction patron; par définition, le mécanisme des patrons de fonction fait que ces instructions sont utilisées par le compilateur pour instancier chaque fois qu il est nécessaire les instructions correspondant à la fonction requise. Il s agit donc formellement de déclarations. Il n est donc pas possible de créer un module objet correspondant à un patron de fonctions. On les place donc dans un fichier d en-tête approprié. possibilité d utiliser le mot clé export, permettant de préciser que le patron de fonction sera accessible depuis un autre fichier source, en se contentant de mentionner son prototype : template <class T> T min(t a, T b); mais cette technique ne fonctionne pas pour tous les compilateurs. Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 35 / 56 Patrons de fonctions Les paramètres de type Un patron de fonction peut comporter un ou plusieurs paramètres de type : Ces paramètres peuvent intervenir de différentes manières : dans l en-tête; dans les déclarations de variables locales; dans les instructions exécutables (new, sizeof(), ). template <c l a s s T, c l a s s U> void f c t (T a, T b, U c ){ T x ; U adr ; adr = new T [ 1 0 ] ; n = s i z e o f (T ) ; Chaque paramètre de type doit apparaître au moins une fois dans l en-tête. Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 36 / 56

Patrons de fonctions Identification La fonction min générique template <c l a s s T> T min (T a, T b ){ return a < b? a : b ; Que se passe t-il si on l appelle sur un entier n et un caractère c? La règle est qu il doit y avoir correspondance absolue des types. On ne peut utiliser la fonction min que pour des appels dans lesquels les deux arguments ont le même type. La réponse est donc une erreur de compilation. Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 37 / 56 Patrons de fonctions Identification template <c l a s s T, c l a s s U> T add (T x, U y, T z ){ return x+y+z ; i n t main ( i n t argc, char argv [ ] ) { i n t n=1,p=2,q=3; const i n t r =2; f l o a t x =2.5, y =5.0; cout << add ( n, x, p ) << e n d l ; cout << add ( x, n, y ) << e n d l ; cout << add ( n, p, q ) << e n d l ; cout << add ( n, p, r ) << e n d l ; cout << add ( n, p, x ) << e n d l ; Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 38 / 56

Patrons de fonctions Forçage du type On peut spécifier un ou plusieurs paramètres de type au moment de l appel du patron. Cela peut forcer la conversion de type. min<int >(c, n ) min<char >(q, n ) add<int, f l o a t >(n, p, x ) add<f l o a t >(n, p, x ) Le mode de transmission d un paramètre (par valeur ou par référence) ne joue aucun rôle dans l identification des paramètres de type. Les paramètres de type peuvent par contre représenter des pointeurs sur un type standard. Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 39 / 56 Patrons de fonctions Les paramètres expressions Il n est pas obligatoire que tous les arguments d un patron de fonction soient de type l un des paramètres, certains peuvent être de type «ordinaire», sous réserve que pour chaque paramètre de type, l un au moins des arguments soient de ce type. #i n c l u d e <i o s t r e a m > u s i n g namespace s t d ; template <c l a s s T> i n t compte (T tab, i n t n ) { i n t i, nz =0; f o r ( i =0; i <n ; i ++) i f (! tab [ i ] ) nz++; r e t u r n nz ; i n t main ( i n t argc, char a r g v [ ] ) { i n t t [ 5 ] = { 5, 2, 0, 2, 0 ; f l o a t f [ 6 ] = { 0., 1 2., 0., 0., 0., 5. ; cout << compte ( t, 5 ) << e n d l ; cout << compte ( f, 6 ) << e n d l ; Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 40 / 56

Patrons de fonctions Surcharge On peut surcharger des patrons de fonctions, c est-à-dire définir plusieurs patrons de fonctions possédant le même nom, mais des arguments différents. : le patron ne comporte que des paramètres de type #i n c l u d e <i o s t r e a m > u s i n g namespace s t d ; template <c l a s s T> T min (T a, T b ) { r e t u r n a < b? a : b ; template <c l a s s T> T min (T a, T b, T c ) { r e t u r n min ( min ( a, b ), c ) ; i n t main ( i n t argc, char a r g v [ ] ) { i n t n=12, p=15, q=2; f l o a t x =3.5, y =4.25, 0. 2 5 ; cout << min ( n, p ) << e n d l ; cout << min ( n, p, q ) << e n d l ; cout << min ( x, y, z ) << e n d l ; Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 41 / 56 Patrons de fonctions Surcharge On peut surcharger des patrons de fonctions, c est-à-dire définir plusieurs patrons de fonctions possédant le même nom, mais des arguments différents. : le patron comporte des paramètres expressions #i n c l u d e <i o s t r e a m > u s i n g namespace s t d ; template <c l a s s T> T min (T a, T b ) { r e t u r n a < b? a : b ; template <c l a s s T> T min (T a, i n t n ) { i n t i ; T min = t [ 0 ] ; f o r ( i =0; i <n ; i ++) i f ( t [ i ] < min ) min=t [ i ] ; r e t u r n min ; i n t main ( i n t argc, char a r g v [ ] ) { l o n g n=2, p=12; f l o a t t [ 6 ] = { 2. 5, 3. 2, 1. 5, 3. 8, 1. 1, 2. 8 ; cout << min ( n, p ) << e n d l << min ( t, 6 ) << e n d l ; Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 42 / 56

Patrons de fonctions Spécialisation Un patron de fonction définit une famille de fonctions ayant le même comportement, le même algorithme. On peut souhaiter définir un comportement particulier pour un type donné, c est le concept de spécialisation : #i n c l u d e <i o s t r e a m > u s i n g namespace s t d ; #i n c l u d e < s t r i n g. h> // pour strcmp template <c l a s s T> T min (T a, T b ) { r e t u r n a < b? a : b ; char min ( char a, char b ) { r e t u r n strcmp ( a, b ) < 0? a : b ; i n t main ( i n t argc, char a r g v [ ] ) { i n t n=2, p=12; char s= m o n s i e u r, t= b o n j o u r ; cout << min ( n, p ) << e n d l << min ( s, t ) << e n d l ; Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 43 / 56 Patrons de fonctions Spécialisation partielle template <c l a s s T, c l a s s U> void f c t (T a, U b ) { template <c l a s s T> void f c t (T a, T b ) { traitement particulier pour un pointeur : T et T*; traitement particulier entre pointeur/référence sur variable et référence sur une variable constante. Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 44 / 56

Patrons de classes Définition De la même manière que les patrons de fonctions, on peut définir des patrons de classes, mais il existe des différences importantes entre les deux notions. La classe point c l a s s p o i n t { i n t x, y ; p u b l i c : p o i n t ( i n t abs =0, i n t ord =0); void a f f i c h e ( ) ; ; Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 45 / 56 Patrons de classes Définition De la même manière que les patrons de fonctions, on peut définir des patrons de classes, mais il existe des différences importantes entre les deux notions. La classe point générique template <c l a s s T> c l a s s p o i n t { T x, y ; p u b l i c : p o i n t (T abs =0, T ord =0); void a f f i c h e ( ) ; ; Qu en est-il de la déclaration des fonctions membres? Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 46 / 56

Patrons de classes Définition La classe point générique #i n c l u d e <iostream > using namespace s t d ; template <c l a s s T> c l a s s p o i n t { T x, y ; p u b l i c : p o i n t (T abs =0, T ord =0) { x=abs ; y=ord ; void a f f i c h e ( ) ; ; template <c l a s s T> void point <T>:: a f f i c h e ( ) { cout << Coordonnees : << x << << y << e n d l ; Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 47 / 56 Patrons de classes Utilisation Utilisation de la classe point générique i n t main ( i n t argc, char argv [ ] ) { point <int > a i ( 3, 5 ) ; point <double> ad ( 3. 5, 2. 3 ) ; Pour les mêmes raisons que les patrons de fonctions, les patrons de classe seront définis dans un fichier d en-tête. Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 48 / 56

Patrons de classes Paramètres de types un patron de classes peut contenir plusieurs paramètres de type, pour peu que chacun d entre eux soit utilisé; en fournissant à la suite du nom de patron un nombre d arguments effectifs égal au nombre de paramètres de type figurant dans la liste du patron, on instancie une classe patron à partir du patron de classe; les paramètres de type effectifs peuvent être un type instancié à partir d un patron de classe : test <int,point<double>> t; ; pas de surcharge de patron de classe; les problèmes de correspondance exacte rencontrés avec les patrons de fonctions n existent plus avec les patrons de classes, car pour ces derniers, c est la liste des paramètres indiqués à la suite du mot template qui compte, et pas la liste des paramètres de l en-tête de la fonction; un patron de classe peut comporter des membres statiques. Dans ce cas, chaque classe patron dispose de son propre jeu de membres statiques. Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 49 / 56 Patrons de classes Paramètres expressions Les paramètres expressions s utilisent différemment avec les patrons de classes : template <c l a s s T, i n t n> c l a s s t a b l e a u { T tab [ n ] ; p u b l i c : ; On précisera la valeur du paramètre expression lors de la déclaration d une instance de ce patron de classe. Il s agit nécessairement de valeurs constantes au type correspondant à celui défini dans le patron de classe. Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 50 / 56

Patrons de classes Spécialisation On peut spécialiser les patrons de classes, comme nous l avons vu avec les patrons de fonction, mais la mise en œuvre est différente : : spécialisation de fonction membre template <c l a s s T> c l a s s p o i n t { T x, y ; p u b l i c : p o i n t (T abs =0, T ord =0) { x=abs ; y=ord ; v o i d a f f i c h e ( ) ; ; template <c l a s s T> v o i d p o i n t <T>:: a f f i c h e ( ) { cout << Coordonnees : << x << << y << e n d l ; v o i d p o i n t <char >:: a f f i c h e ( ) { cout << Coordonnees : << ( i n t ) x << << ( i n t ) y << e n d l ; On peut généraliser cette spécialisation de fonctions membres au cas où le patron de classe a plusieurs paramètres (type ou expressions). Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 51 / 56 Patrons de classes Spécialisation spécialiser une ou plusieurs fonctions membres, sans modifier la définition de la classe elle-même; spécialiser la classe elle-même, en en fournissant une nouvelle définition. On peut alors spécialiser certaines fonctions membres; spécialiser partiellement un patron de classe à plusieurs paramètres; une autre forme de spécialisation est de donner une valeur ar défaut à certains types : template <c l a s s T, c l a s s U=f l o a t > c l a s s A { ; template <c l a s s T, i n t n=3> c l a s s B { ; A<i n t, long> a1 ; A<i n t > a2 ; B<i n t, 3> b1 ; B<i n t > b2 ; Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 52 / 56

Patrons de classes et amitié déclarer des classes ordinaires et des fonctions ordinaires amies d un patron de classe; template <c l a s s T> c l a s s e s s a i { i n t x ; p u b l i c : f r i e n d c l a s s A ; f r i e n d i n t f c t ( f l o a t ) ; ; déclarer des instances particulières de classes patrons ou de fonctions patrons amies du patron de classe; déclarer un autre patron de classe ou de fonction ami d un patron de classe. Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 53 / 56 Patrons de classes et amitié déclarer des classes ordinaires et des fonctions ordinaires amies d un patron de classe; déclarer des instances particulières de classes patrons ou de fonctions patrons amies du patron de classe; template <c l a s s T> c l a s s p o i n t { ; template <c l a s s T> i n t f c t (T x ) { template <c l a s s T, c l a s s U> c l a s s e s s a i { i n t x ; p u b l i c : f r i e n d c l a s s point <int >; f r i e n d i n t f c t ( double ) ; ; déclarer un autre patron de classe ou de fonction ami d un patron de classe. Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 54 / 56

Patrons de classes et amitié déclarer des classes ordinaires et des fonctions ordinaires amies d un patron de classe; déclarer des instances particulières de classes patrons ou de fonctions patrons amies du patron de classe; template <c l a s s T> c l a s s p o i n t { ; template <c l a s s T> i n t f c t (T x ) { template <c l a s s T, c l a s s U> c l a s s e s s a i { i n t x ; p u b l i c : f r i e n d c l a s s point <T>; f r i e n d i n t f c t (U ) ; ; déclarer un autre patron de classe ou de fonction ami d un patron de classe. Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 55 / 56 Patrons de classes et amitié déclarer des classes ordinaires et des fonctions ordinaires amies d un patron de classe; déclarer des instances particulières de classes patrons ou de fonctions patrons amies du patron de classe; déclarer un autre patron de classe ou de fonction ami d un patron de classe template <c l a s s T, c l a s s U> c l a s s e s s a i { i n t x ; p u b l i c : template <c l a s s X> f r i e n d c l a s s point <X>; template <c l a s s X> f r i e n d i n t f c t ( point <X>); ; Nicolas Kielbasiewicz (C.D.C.S.P./I.S.T.I.L./I.C.J.) Génie Logiciel I Filière M.A.M. 2ème année - 08/09 56 / 56