classes-1-2

27
Chapitre 3 : Les classes Niveau : II1 Préparé par : Raoudha CHEBIL 1 o DÉCLARATION ET DÉFINITION D’UNE CLASSE o CONSTRUCTEUR ET DESTRUCTEUR o SURCHARGE DES OPÉRATEURS o BIBLIOTHÈQUE DE FLOTS o DONNÉES STATIQUES o GÉNÉRICITÉ 1 Chapitre 3 : Les classes Préambule 2 Rappel : les structures en C struct point { int x ; int y ; } ; x et y : ce sont des champs ou des membres de la structure point. En C++ : Associer à une structure, en plus des données, des fonctions nommées « fonctions membres » ou « méthodes ». En POO pure, les données sont « encapsulées » => leur accès ne peut se faire que par le biais des méthodes.

Upload: said-h-djo

Post on 04-Oct-2015

4 views

Category:

Documents


0 download

DESCRIPTION

Chap3-suite

TRANSCRIPT

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 1

    o DCLARATION ET DFINITION DUNE CLASSEo CONSTRUCTEUR ET DESTRUCTEURo SURCHARGE DES OPRATEURSo BIBLIOTHQUE DE FLOTSo DONNES STATIQUESo GNRICIT

    1

    Chapitre 3 : Les classes

    Prambule2

    Rappel : les structures en Cstruct point {

    int x ;int y ;

    } ;

    x et y : ce sont des champs ou des membres de la structure point.

    En C++ :Associer une structure, en plus des donnes, des fonctions nommes

    fonctions membres ou mthodes .

    En POO pure, les donnes sont encapsules => leur accs ne peut se faire que par le biais des mthodes.

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 2

    Dclaration et dfinition dune classe

    3

    Une syntaxe possible pour la dfinition dune classe est :

    class{

    // dclaration des attributs

    ...

    public ://

    Prototype et dfinition des mthodes

    ...

    };

    La classe est dfinie laide dun bloc et se termine par un ;

    private :

    Exemple4

    class point

    { // dclaration des membres privs

    private :

    int x ;

    int y ;

    // dclaration des membres publics

    public :

    void initialise (int, int) ;

    void deplace (int, int) ;

    void affiche () ;

    } ;

    void main(){

    point p;

    p.initialise(-2,5);}

    Dclaration de la classe point

    Instanciation de la classe pointen un objet p

    On applique la mthode initialise l'objet p

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 3

    Protection/visibilit5

    class point

    { // dclaration des membres privs

    private :

    int x ;

    int y ;

    // dclaration des membres publics

    public :

    void initialise (int, int) ;

    void deplace (int, int) ;

    void affiche () ;

    } ;

    void main()

    {

    Point p;

    p.initialise(5,2);

    p.deplace(3,6);

    p.affiche();

    p.x=5;

    }Illgal

    Protection/visibilit6

    class point

    { // dclaration des membres privs

    private :

    int x ;

    int y ;

    // dclaration des membres publics

    public :

    void initialise (int, int) ;

    void affiche () ;

    Private :

    void deplace (int, int) ;

    } ;

    void main()

    {

    Point p;

    p.initialise(5,2);

    p.deplace(3,6)

    } Illgal

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 4

    Exploitation dune classe7

    Trois types dinstructions : Dclaration de la classe

    Dfinition de la classe

    Utilisation de la classe

    En pratique, on aura souvent intrt dcoupler la classe de son utilisation.

    On sera alors gnralement amens isoler les instructions dedclarationde la classe dans un fichier en-tte (extension .h) quil suffira dinclure(par #include) pour compiler lapplication.

    Exploitation dune classe8

    class point

    { /* dclaration des membres privs */int x ;

    int y ;

    public : /* dclaration des membres publics */

    void initialise(int, int);

    void deplace (int, int) ;

    void affiche () ;

    } ;

    Fichier entte point.h

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 5

    Exploitation dune classe9

    #include

    #include "point.h" // pour introduire les dclarations de la classe point

    using namespace std ;

    /* Dfinition des fonctions membres de la classe point */

    void point::initialise(int abs,int ord)

    {x=abs; y=ord;

    }

    void point::deplace (int dx, int dy)

    { x = x + dx ; y = y + dy ;

    }

    void point::affiche ()

    { cout

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 6

    Exploitation dune classe11

    #include #include "point.h"

    void main()

    {

    point p;

    p.initialise(5,2);

    p.deplace(3,6);

    p.affiche();

    }

    Utilisation de la classe point

    Inclusions multiples12

    Dans certaines circonstances (quon verra plus tard), l'utilisateur d'uneclasse peut tre amen,sans qu'il en ait conscience, inclure plusieursfois un mme fichier en-tte lors de la compilation d'un mme fichiersource.

    Erreurs de compilation, lies tout simplement la redfinition de laclasse concerne.

    En gnral, on rglera ce problme en protgeant systmatiquementtout fichier en-tte des inclusions multiples par une technique de compilation conditionnelle, comme dans :

    #ifndef POINT_H#define POINT_H// dclaration de la classe point#endif

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 7

    13

    Affectation dobjets

    class point{ int x,y ;

    };

    void main(){

    point a,b;

    b=a;}

    Provoquera la recopie des valeurs des membres x et y de a dans les membres correspondants de b.

    class A {

    public :

    int f() { return i;}

    void f(int val) { i=val;}

    private :

    int i;

    };

    Surcharge des mthodes

    14

    void main ()

    {

    A a;

    a.f(10);

    cout

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 8

    Modifieurs et Accesseurs 15

    La clause optionnelleconst, situeaprs la signature dsigne une mthodede type accesseur (c.a.d. ne change pasl'tat de l'instance)

    class A {

    public :

    int get_i(){ returni;}

    void set_i( int val) { i=val;}

    private :

    int i;

    };

    ...

    int get_i() const

    {

    i = 0;

    return i;

    }

    Mthodes inline16

    Les fonctions en ligne (ou inline) permettent daccrotre l'efficience d'unprogramme dans le cas de fonctions courtes.

    Pour rendre en ligne une fonction membre, on peut :

    soit fournir directement la dfinition de la fonction dans la dclarationmme de la classe ; dans ce cas, le qualificatifinline n'a pas tre utilis ;

    soit procder comme pour une fonction ordinaire en fournissant unedfinition en dehors de la dclaration de la classe ; dans ce cas, lequalificatif inline doit apparatre la fois devant la dclaration et devantl'en-tte.

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 9

    Mthodes inline17

    class A {

    public :

    inline void g( int val);

    void f(int x) {i=x;}

    private :

    int i; };

    inline void A::g(int val){ i=val;}

    Mthodes inline

    Cration/Destruction dobjets 18

    point p1;

    p1.initialise(1,2);

    En cas doubli de cette instruction, quelles seront les

    valeurs de p.x et p.y?

    class point{ /* dclaration des membres privs */

    int x ;int y ;public : /* dclaration des membres publics */

    void initialise(int, int);void deplace (int, int) ;void affiche () ;

    } ;

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 10

    Constructeur19

    Une fonction membre portant le mme nom que sa classe se nommeconstructeur,

    Un constructeur peut avoir des arguments mais ne renvoie pas de valeur(aucune indication de type mme pasvoid ),

    Le constructeur est appel automatiquement chaque cration d'unobjet.

    Destructeur20

    Une fonction membre portant le mme nom que sa classe, prcde dusymbole (~), se nommedestructeur,

    Un destructeur ne peut pas comporter darguments et il ne renvoie pas devaleur (aucune indication de type ne doit tre prvue ),

    Le destructeur est appel implicitement avant la libration de lespacemmoire associ lobjet.

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 11

    Constructeur / Destructeur 21

    class point{ /* dclaration des membres privs */

    int x ;int y ;

    public : /* dclaration des membres publics */point(int, int); //constructeur void deplace (int, int) ;void affiche () ;

    ~point(); //destructeur

    } ;

    Le constructeur est appel aprs la cration de lobjet,Le destructeur est appel avant la destruction de l'objet.

    22

    les deux dclarations suivantes seront incorrectes :

    point a ; // incorrect : le constructeur attend deux argument s

    point b (3) ; // incorrect (mme raison)

    point a(1, 7) ; // correct car le constructeur possde deux arguments

    /*S'il existe plusieurs constructeurs, il suffit que ladclaration comporte les arguments requis par l'un d'entreeux. Ainsi, si on ajoute le constructeur suivant :*/

    point ( ) ; // constructeur 1

    point (int, int) ; // constructeur 2

    point a(5) ; // incorrect : aucun constructeur un argument

    point a ; // correct : appel du constructeur 1

    point b(1, 7) ; // correct : appel du constructeur 2

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 12

    Constructeur / Destructeur

    Le corps du constructeur peut tre prcd par une sectionoptionnelle introduite par ":" , spcifiquement rserve l'initialisation des attributs.

    Il est possible de changer la valeur des attributs dans le corps duconstructeur.

    Les attributs non initialiss dans cette section prendront une valeurpar dfaut dans le cas o une telle valeur existe.

    A::A(int val)

    : i(val)

    {

    i = ...;

    }

    initialisation

    affectation

    23

    24

    Les objetsautomatiquessont ceux crs par une dclaration Dans une fonction

    Dans un bloc

    Lobjet est cr lors de la rencontre de sa dclaration. Il est dtruit la fin de l'excution de la fonction ou du bloc.

    Constructeur / Destructeur

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 13

    class A {public :

    A();

    ...

    ~A();...

    };

    void main ()

    {

    A a;

    cout

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 14

    27

    Les objetsdynamiquessont des objets pour lesquels lespace mmoirerequis par lobjet est allou dynamiquement.

    Aprs l'allocation dynamique, l'oprateurnewappellera un constructeur delobjet.

    Avant la libration de l'emplacement mmoire correspondant, l'oprateurdeleteappellera le destructeur.

    Constructeur / Destructeur

    class A {public :

    A();

    ...

    ~A();...

    };

    void main ()

    {

    A *ptr;

    ...

    ptr = new A;

    cout

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 15

    class A {public :

    A();A(int);

    int f(); ...

    ~A();};

    void main (){

    A a1;

    A a2(5);

    A * ptr;

    cout

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 16

    31

    point a(1,1) ; // un objet statique de classe point

    void main(){cout

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 17

    Constructeur par dfaut

    Lorsqu'on ne dfinitaucun constructeurpour une classe, le compilateur secharge de gnrer automatiquement un constructeur par dfaut (minimaliste= initialisation par dfaut des attributs).

    class A {

    int i;

    public :

    A():i(10){ }

    };

    class B {

    int j;

    public :

    B() : j(0) { }

    };

    class C {

    .

    A objA;

    B objB;

    };

    C() :

    objA() objB()

    { }

    auto-gnr

    33

    Pas de constructeurpour la classe C

    Constructeur par dfaut 34

    class A {

    int i;

    public :

    A():i(10){ }

    };

    class B {

    int j;

    public :

    B(int x) : j(x) { }

    };

    class C {

    .

    A objA;

    B objB;

    };

    main()

    {

    C objc;

    }

    erreur

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 18

    ExerciceEcrivez une classeVecteur comportant : commemembres donnes (attributs) privs: trois composantes de type

    double,

    commefonctions membres (mthodes) publiques:

    -Un constructeur avec 3 arguments,-Un constructeur sans arguments (initialisant chaque composante 0) ;-homothtie pour multiplier les composantes par une valeur fournie en

    argument,

    -affiche pour afficher les composantes du vecteur. Ajoutez la premire classe Vecteur prcdente une fonction membre

    nommeprod_scal fournissant en rsultat le produit scalaire de deuxvecteurs.

    Ajoutez la classe Vecteur une fonction membre nommesommepermettant de calculer la somme de deux vecteurs.

    36

    class vect{

    int nelem ; // nombre d'lmentsdouble * adr ; // pointeur sur ces lments

    public :vect (int n) // constructeur "usuel"{ adr = new double [nelem = n] ;

    cout

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 19

    37

    class vect{

    int nelem ; // nombre d'lmentsdouble * adr ; // pointeur sur ces lments

    public :vect (int n) // constructeur "usuel"{ adr = new double [nelem = n] ;

    cout

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 20

    39

    5 5

    a b

    La fonction f admet un paramtre pass par valeur. Donc lexcution def sefait sur unecopiede lobjeta dsigne parb.

    A la fin de l'excution de la fonctionf , le destructeur~vecteur est appelpourb, cequi libre l'emplacement point paradr ;

    A la fin de lexcution de la fonctionmain , le destructeur est appel poura, iltente de librer le mme emplacement.

    Cette tentative constitue une erreur d'excution dont les consquences varientavec limplmentation : afin de rsoudre un tel problme, on utilise leconstructeur de recopie.

    Constructeur de recopie

    Constructeur de recopie

    A::A(const A & a)

    : i(a.i)

    {

    i = ...;

    }

    Forme gnrale

    (const < id_classe > & obj) : ...

    {

    }

    void main()

    {

    A a1;

    A a2(a1);

    }

    10

    10

    a1

    a2

    40

    Le constructeur de recopie ne retourne rien et a le mme nom que la classe.

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 21

    41

    Lorsque le constructeur de recopie n'est pas dfini, le compilateur gnreun de manire automatique qui copie les attributs en invoquant lesconstructeurs de recopie de chacun d'eux : celui-ci nest pas toujoursadquat , et lexemple prcdent le prouve.

    Constructeur de recopie

    42class vect{

    int nelem ; // nombre d'lmentsdouble * adr ; // pointeur sur ces lments

    public :vect (int n) // constructeur "usuel"{}

    vect (const vect & v) // constructeur de recopie{ adr = new double [nelem = v.nelem] ; // cration nouvel objet

    // copie de l'ancien tableauint i ; for (i=0 ; i

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 22

    void fct (vect b){ cout

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 23

    45

    o Fonction extrieure la classe ayant accs aux donnes prives de laclasse.

    o Contraire la POO mais utile parfois.

    o Plusieurs situations damiti :

    Fonction indpendante, amie d'une classe,

    Fonction membre d'une classe, amie d'une autre classe,

    Fonction amie de plusieurs classes,

    Toutes les fonctions membres d'une classe, amies d'une autre classe.

    Friend type_retour NomFonction (arguments)

    Fonction amie

    46

    #include

    using namespace std ;

    class point

    { int x, y ;

    public :

    point (int abs=0, int ord=0) // un constructeur ("inl ine")

    { x=abs ; y=ord ; }

    // dclaration fonction amie (indpendante) nomme coincide

    friend int coincide (point, point) ;

    } ;

    int coincide (point p, point q) // dfinition de coi ncide

    { if ((p.x == q.x) && (p.y == q.y)) return 1 ;

    else return 0 ;

    }

    Fonction amie

    fonction indpendante, amie d'une classe

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 24

    47

    class A {

    // partie prive .....

    // partie publique .....

    friend int B::f (char, A) ;

    } ;

    int B::f (char ..., A ...)

    { // on a accs ici aux membres privs de tout objet A}

    Class B{int f(char, A);};

    fonction membre d'une classe, amie d'une autre classe

    Fonction amie

    48

    class A

    { // partie prive..... .....

    // partie publique // partie publique

    friend void f(A, B) ;

    ..... .....

    } ;

    Fonction amie

    class B{ // partie prive..... .....

    // partie publique // partie publique

    friend void f(A, B) ;..... .....} ;

    void f(A..., B...){ // on a accs ici aux membres privs de nimporte quel objet de type A ou B}

    fonction amie de plusieurs classes

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 25

    49

    Il est plus simple d'effectuer une dclaration globale. Ainsi, pour dire quetoutes les fonctions membres de la classe B sont amies de la classe A,on placera, dans la classe A, la dclaration :

    friend class B ;

    Fonction amie

    Toutes les fonctions membres d'une classe, amies d'une autre classe

    50

    class point

    { int x, y ;

    public :

    point (int abs=0, int ord=0) { x=abs ; y=ord ;} //con structeur

    void affiche () { cout

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 26

    Surcharge doprateurs

    Dans ce cas, la fonctionoperator + doit disposer de deux argumentsde typepoint et fournir une valeur de retour du mme type.

    Elle peut tre une fonctionmembrede la classe concerne (classpoint dans ce cas) ou une fonctionindpendantedclareamiede laclasse concerne (puisquelle devra pouvoir accder aux membres privsde la classe) ;

    51

    52

    1er cas : fonction membreclass point

    { int x, y ;

    public :

    point (int abs=0, int ord=0) { x=abs ; y=ord ;} //con structeur

    point operator + (point) ;

    void affiche () { cout

  • Chapitre 3 : Les classes Niveau : II1

    Prpar par : Raoudha CHEBIL 27

    53

    point operator + (point a, point b){ point p ;

    p.x = a.x + b.x ; p.y = a.y + b.y ;return p ;

    }c = a + b c=operator + (a, b)

    Surcharge doprateurs

    2eme cas : fonction amie

    class point{ int x, y ;public :point (int abs=0, int ord=0) { x=abs ; y=ord ;} //con structeurfriend point operator + (point , point ) ;void affiche () { cout