introd c++

Upload: fatia-bennany

Post on 08-Apr-2018

245 views

Category:

Documents


1 download

TRANSCRIPT

  • 8/7/2019 introd C++

    1/86

    Master MIDO - 2me anne

    Spcialit ID/MIAGE-IF/MIAGE-SITN

    Le lan a e C++ artie I

    Maude Manouvrier

    Quest ce que le C++ ?appe s sur a ges on e a m mo re

    Premiers pas en C++ : typage, compilation, structure de contrle, Classes et ob ets : dfinitions et 1er exem le de classe

    Notions de constructeurs et destructeur

    Proprits des mthodes Surcharge des oprateurs Objet membre

    http://www.lamsade.dauphine.fr/~manouvri/C++/CoursC++_MM.html

  • 8/7/2019 introd C++

    2/86

    Biblio ra hie

    Le Langage C++ (The C++ Programming Language), dearne rous rup, sson- es ey ern re on

    2003

    How to program C and introducing C++ and Java, deH.M. Deitel et P.J. Deitel, Prentice Hall, 2001 dernire

    t on ++ ow o rogram e vr er Programmer en langage C++, 6me dition de Claude

    Delannoy, Eyrolles, 2004

    , , ,1999

    Merci

    Maude Manouvrier - Univ. Paris Dauphine 2Batrice Brard, Bernard Hugueney, Frdric Darguesse, Olivier Carles etJulien Saunier pour leurs documents!!

  • 8/7/2019 introd C++

    3/86

    Documents en ligne

    Petit manuel de survie pour C++ de Franois Laroussinie,2004-2005

    http://www.lsv.ens-cachan.fr/~fl/Cours/docCpp.pdf

    Philippe Laleve et Chantal Taconet, 2000http://www-inf.int-evry.fr/COURS/C++/CoursEA/

    Thinking in C++ de Bruce Eckel, 2003http://mindview.net/Books/TICPP/ThinkingInCPP2e.html

    + voir surhttp://www.librecours.org ethttp://www.freetechbooks.com/

    Aide en ligne :http://www.cplusplus.com/

    Maude Manouvrier - Univ. Paris Dauphine 3

  • 8/7/2019 introd C++

    4/86

    Histori ue du Lan a e C++

    de Bell Labs AT&T en 1980 Appel lorigine Langage C avec classes

    (ISO/IEC 14882)

    NSI : American National Standard Institute

    ISO : International Standard Organization

    Maude Manouvrier - Univ. Paris Dauphine 4

  • 8/7/2019 introd C++

    5/86

    uest-ce ue le C++ ?

    Daprs Bjarne Stroustrup, conception du langage C++ pour : re me eur en , Permettre les abstractions de donnes

    Permettre la programmation oriente-objet

    Compatibilit C/C++ [Alard, 2000] : C++ = sur-ensemble de C,

    C++ ajout en particulier de lorient-objet (classes, hritage,polymorphisme), Cohabitation ossible du rocdural et de lorient-ob et en C++

    Diffrences C++/Java [Alard, 2000] :

    C++ : lan a e com il / Java : lan a e inter rt ar la JVM C/C++ : passif de code existant / Java : JNI (Java Native Interface) C++ : pas de machine virtuelle et pas de classe de base /java.lang.object C++ : "plus proche de la machine" (gestion de la mmoire)

    Maude Manouvrier - Univ. Paris Dauphine 5

  • 8/7/2019 introd C++

    6/86

    Diffrences Java et C++

    Gestion de la mmoire [Alard, 2000] : ava

    Cration des objets par allocation dynamique (new) Accs aux ob ets ar rfrences Destruction automatique des objets par le ramasse miettes

    C++

    Allocation des objets en mmoire statique (variables globales), dans la pile(variables automatiques) ou dans le tas (allocation dynamique),

    Libration de la mmoire la charge du programmeur dans le cas de

    l'allocation dynamique Autres possibilits offertes par le C++ :

    Variables globales, compilation conditionnelle (prprocesseur), pointeurs,,

    Maude Manouvrier - Univ. Paris Dauphine 6

  • 8/7/2019 introd C++

    7/86

  • 8/7/2019 introd C++

    8/86

    Ra el : Pile et Tas 2/6

    Exemple de programme en C :

    /* liste.h */

    {

    int valeur;

    struct Cell * suivant;}

    typedef struct Cell Cell;

    Cell * ConstruireListe(int taille);

    Maude Manouvrier - Univ. Paris Dauphine repris des transparents dOlivier Carles 8

  • 8/7/2019 introd C++

    9/86

    Rappel : Pile et Tas (3/6)

    Exemple de programme en C :

    Cell * ConstruireListe(int taille)

    {

    int i

    Cell *cour, *tete;

    for (i=taille; i >= 0; i--)

    {

    cour = e ma oc s zeo e ;

    cour->valeur = i;

    cour->suivant = tete;* Point darrt 2 cf transparent 11 *tete = cour;

    }

    return tete;

    }Maude Manouvrier - Univ. Paris Dauphine adapt des transparents dOlivier Carles 9

  • 8/7/2019 introd C++

    10/86

    Ra el : Pile et Tas 4/6

    Exemple de programme en C :

    #include

    #include

    #include

    #include "liste.h"

    intmain (){

    Cell * tete

    tete = ConstruireListe(4);

    /* Point darrt 1 cf transparent 12 */

    return 1;

    }

    Maude Manouvrier - Univ. Paris Dauphine repris des transparents dOlivier Carles 10

  • 8/7/2019 introd C++

    11/86

  • 8/7/2019 introd C++

    12/86

    Rappel : Pile et Tas (6/6)tat de la mmoire au point darrt 1

    tete valeur 1 valeur 2

    our ma n

    valeur

    sui ant

    3valeur

    sui ant

    4

    Maude Manouvrier - Univ. Paris Dauphine adapt des transparents dOlivier Carles 12Pile Tas

  • 8/7/2019 introd C++

    13/86

    Exemple de programme C++

    /* Exemple repris du bouquin "How To Program" de Deitel etDeitel - page 538 */

    #include

    intmain

    {

    int iEntier1;

    cout iEntier1; // Lit un entierint iEntier2, iSomme;

    cou iEntier2;

    iSomme = iEntier1 + iEntier2;cout

  • 8/7/2019 introd C++

    14/86

    cout et cin (1/2)

    Entres/sorties fournies travers la librairie iostream

    1 n Instruction affichant expr1 puis expr2, etc. cout : flot de sortie associ la sortie standard stdout

    : oprateur similaire

  • 8/7/2019 introd C++

    15/86

    cout et cin (2/2)

    Possibilit de modifier la faon dont les lments sont lus ou crits dans le flot :dec lecture/criture d'un entier en dcimal

    '

    hex lecture/criture d'un entier en hexadcimal

    endl insre un saut de ligne et vide les tampons

    setw(int n) affichage den caractressetprecision(int n) affichage de la valeur avecn chiffres

    avec ventuellement un arrondi de la valeursetfill(char) dfinit le caractre de remplissage

    #include

    < >

    intmain() {

    int i=1234;

    float =12.3456 *****4d2cout

  • 8/7/2019 introd C++

    16/86

    Organisation dun programme C++ Programme C++ gnralement constitu de plusieurs modules, compils

    sparment

    Fichier entte dextension .h (ou .hh ou .hpp)

    Contenant les dclarations de types, fonctions, variables et constantes, etc.

    Fichier source dextension .cpp ou .C

    #include

    extern char* MaChaine;

    MonFichierEnTete.h

    MonProgPirncipal.cpp

    extern void MaFonction();

    MonFichier.cpp

    #include "MonFichierEnTete.h"

    char *MaChaine="Chane afficher";

    int main()#include "MonFichierEnTete.h"

    void MaFonction()

    {

    " "

    {

    MaFonction();

    }

    Maude Manouvrier - Univ. Paris Dauphine 16

    }

  • 8/7/2019 introd C++

    17/86

    Compilation

    Langage C++ : langage compil => fichier excutable

    Compilation en 3 phases : Preprocessing : Suppression des commentaires et traitement des

    directives de compilation commenant par # => code source brut

    omp a on en c er o e : comp a on u source ru => c er

    objet (portant souvent l'extension .obj ou .o sans main)

    'ceux des bibliothques qu'elle utilise =>fichier excutable binaire ouune librairie dynamique (.dll sous Windows)

    Compilation => vrification de la syntaxe mais pas devrification de la gestion de la mmoire (erreurdexcution segmentation au t)

    Maude Manouvrier - Univ. Paris Dauphine repris et adapt de Wikipedia 17

  • 8/7/2019 introd C++

    18/86

    Erreurs nres

    Erreur de syntaxe, dclaration manquante,parenthse manquante,...

    Erreur de liens Appel a des fonctions dont les bibliothques sont

    Erreur dexcution Segmentation fault, overflow, division par zro

    Erre r lo i e

    Maude Manouvrier - Univ. Paris Dauphine repris des transparents de cours de Julien Saunier 18

  • 8/7/2019 introd C++

    19/86

    Compilateur C++ Compilateurs gratuits (open-source) :

    Plu in C++ our Ecli se http://www.eclipse.org/cdt/

    Tlcharger http://www.eclipselabs.org/p/wascana

    pour dvelopper sous Windows Dernire version Juin 2010

    Dev-C++ 5 http://www.bloodshed.net/devcpp.html

    Apparemment pas de mise jour depuis 2005

    omp ateurs propr ta res : Visual C++ (Microsoft disponible au CRIO INTER-UFR-version

    ratuite dis onible Visual Ex ress mais ncessit de sinscrire sur lesite de Windows : http://msdn.microsoft.com/fr-fr/express/)

    Borland C++ (version libre tlchargeable ladresse :htt ://www.code ear.com/downloads/free/c builder

    Maude Manouvrier - Univ. Paris Dauphine 19

  • 8/7/2019 introd C++

    20/86

    Quelques rgles de programmation

    1. Dfinir les classes inclure les librairies etc. dans un fichierdextension .h

    2. Dfinir le corps des mthodes et des fonctions, le programmemainetc. dans un fichier dextension .cpp (incluant le fichier .h)

    3. Compiler rgulirement

    4. Pour dboguer : Penser utiliser les commentaires et les cout

    ser e ogueur

    Maude Manouvrier - Univ. Paris Dauphine figure reprise de http://www.maths.manchester.ac.uk/~ahazel/EXCEL_C++.pdf 20

  • 8/7/2019 introd C++

    21/86

    Espaces de noms Utilisation despaces de noms (namespace) lors de lutilisation

    de nombreuses bibliothques pour viter les conflits de noms

    Espace de noms : association dun nom un ensemble de

    variable, types ou fonctionsEx. Si la fonction MaFonction() est dfinie dans lespace de noms

    MonEspace, lappel de la fonction se fait parMonEspace::MaFonction()

    Pour tre parfaitement correct :std::cins ::cou

    std::endl

    :: op ra eur e r so u on e por e

    using std::cout ; // pour une fonction spcifique

    using namespace std; // pour toutes les fonctions

    Maude Manouvrier - Univ. Paris Dauphine 21

  • 8/7/2019 introd C++

    22/86

    Types de base (1/5)

    Hritage des mcanismes de bases du C (pointeurs inclus)Attention : t a e fort en C++!!

    Dclaration et initialisation de variables :bool this_is_true = true; // variable bolenne

    int i = 0; // entier

    float f = 3.1; // rel

    // rel double prcision

    doublepi = 3.141592653589793238462643;

    char c=a; // caractre

    n t a sat on a mo e o et :

    int i(0) ;

    Maude Manouvrier - Univ. Paris Dauphine repris et adapt de http://finance.bi.no/~bernt/gcc_prog/recipes/recipes.pdf 22

    ong ;

  • 8/7/2019 introd C++

    23/86

    Types de base (2/5)

    Le type dune donne dtermine : z

    Les oprations lgaleses ornes

    Maude Manouvrier - Univ. Paris Dauphine repris des transparents de cours de Julien Saunier et de http://www.cplusplus.com/ 23

  • 8/7/2019 introd C++

    24/86

    Types de base (3/5) : rel

    Reprsent par un nombre virgule flottante :

    Reste des bits permettant de coder le nombre sans virgule (mantisse)

    ,pour l'exposant, 1 bit pour le signe

    Nombre de bits pour le type double (64 bits) : 52 bits pour la mantisse, 11

    bits pour l'exposant, 1 bit pour le signe Nombre de bits pour le type long double (80 bits) : 64 bits pour la

    mantisse, 15 its pour l'exposant, 1 it pour le signe

    Prcision des nombres rels approche, dpendant du nombre de positions,

    6 chiffres aprs la virgule pour le type float

    15 chiffres a rs la vir ule our le t e double

    Maude Manouvrier - Univ. Paris Dauphine repris et adapt de http://www.commentcamarche.net/contents/cpp/ 24

    17 chiffres aprs la virgule pour le type long double

  • 8/7/2019 introd C++

    25/86

    Deux types pour les caractres, cods sur 8 bits/1octets

    char (-128 127)

    unsigned char (0 255)Exemple: a c $ \n \t

    Les caractres imprimables sont toujours positifs

    Caractres spciaux :

    \t (tabulation horizontale)

    \f (nouvelle page)\b (backspace)EOF,

    Maude Manouvrier - Univ. Paris Dauphine repris des transparents de cours de Julien Saunier 25

  • 8/7/2019 introd C++

    26/86

    Types de base (5/5) : Tableau

    int tab1[5] ; // Dclaration dun tableau de 5 entiers

    // Dclaration et initialisation dun tableau de 3

    entiers

    int tab2 [] = {1,2,3} ; // Les indices commencent zro

    int tab_a_2dim[3][5];

    tab_a_2dim[1][3]

    char chaine[]= "Ceci est une chane de caractres"; // Attention, le dernier caractre dune chane est \0

    char ch[]= "abc" ; // char ch[]= {a,b,c, \0};

    Maude Manouvrier - Univ. Paris Dauphine repris et adapt de http://www.cplusplus.com/doc/tutorial/arrays.html 26

    D l i l did ifi i

  • 8/7/2019 introd C++

    27/86

    Dclaration, rgles didentification et

    Toute variable doit tre dclare avant dtre utilise

    Constante symbolique : const int taille = 1000;// Impossible de modifier taille dans la suite du programme

    a port e v s t une var a e commence a n e sa c arat on usqu afin du bloc de sa dclaration

    // une fonction nomme f de paramtre i

    void f (int i) { int j; // variable locale

    j=i;

    }

    Toute double dclaration de variable est interdite dans le mme blocint i,j,m; // variable globale

    vo n

    int j,k; // variable locale

    char k; // erreur de compilation

    Maude Manouvrier - Univ. Paris Dau hine repris et adapt des transparents de cours de Julien Saunier27

    m=0;}

  • 8/7/2019 introd C++

    28/86

  • 8/7/2019 introd C++

    29/86

    Oprateurs de comparaison

    int i,j;

    if(i==j) // valu vrai (true ou !=0) si i gal j

    {

    // instructions excutes si la condition est vraie

    }

    if(i!=j) // valu vrai (true ou !=0) si i est diffrent de j

    == =

    if(false) // toujours valu faux

    if(true) // toujours valu vrai

    Ne pas confondre = (affectation) et == (test dgalit)

    if i=1 tou ours vrai et i vaut 1 a rs

    Maude Manouvrier - Univ. Paris Dauphine repris et adapt de http://finance.bi.no/~bernt/gcc_prog/recipes/recipes.pdfet de http://www.cplusplus.com/doc/tutorial/operators.html 29

    O ti l h d t

  • 8/7/2019 introd C++

    30/86

    Oprations sur les chanes de caractres .

    Voir documentation :http://www.cplusplus.com/reference/clibrary/cstring/

    .

    #include

    intmain ()

    {char source[]="chane exemple",destination[20];

    strcpy (destination,source); // copie la chane source dans la

    chane destination

    Sur la classe string : mthodes appliques aux objets de la classe string

    Voir documentation : http://www.cplusplus.com/reference/string/string/#include

    #include

    using namespace std;

    On reviendra sur les notions de

    intmain ()

    {

    string str ("chane test");

    " " " "

    Maude Manouvrier - Univ. Paris Dauphine repris et adapt des transparents de cours de Julien Saunier et de http://www.cplusplus.com30

    . .

    return 0;

    }

    S d l (1/4)

  • 8/7/2019 introd C++

    31/86

    Structures de contrles (1/4)

    x = 10;y = x > 9 ? 100 : 200; // quivalent

    // if(x>9) y=100;

    // else y=200;

    intmain(){

    float a;

    cou > a;

    else

    if(a == 0) cout

  • 8/7/2019 introd C++

    32/86

    Structures de contrles (2/4)

    for(initialisation; condition; incrmentation)instruction; // entre {} si plusieurs instructions

    for(int i=1; i

  • 8/7/2019 introd C++

    33/86

    Structures de contrles (3/4)intmain()

    { char ch;

    double x=5.0, y=10.0;

    " ".

    cout ch;

    switch(ch)

    {

    " "

    break; // pour sortir du switch

    // et ne pas excuter les commandes suivantes

    case 2: cout

  • 8/7/2019 introd C++

    34/86

    Structures de contrles (4/4)

    intmain (){

    int n=8;

    while (n>0)

    { cout

  • 8/7/2019 introd C++

    35/86

    Type rfrence (&)

    Possibilit de dfinir une variable de typerfrence

    int i = 5; Impossible de dfinir unen = ; reo// i et j dsignent le mme emplacement mmoire

    r rence sans n a ser

    r rencemen au oma que :Application automatique de l'oprateur d'indirection * c aque u sa on e a r renceint i = 5;

    Une fois initialise, unen = ; reoint k = j; // k reoit 5j += 2; // i reoit i+2 (=7)

    !rfrence ne peut plus

    tre modifie elle

    correspond au mme

    j = k; i reoit k (=5)

    Maude Manouvrier - Univ. Paris Dauphine 35

    emp acemen m mo re

    Pointe rs (1/8)

  • 8/7/2019 introd C++

    36/86

    Pointeurs (1/8)

    Mmoire dcompose en "cases" (1 octet) conscutives numrotes(ayant une adresse) que lon peut manipuler individuellement ou pargroupe e cases cont g es

    i: 0000 0000 0000 0011

    int i=10 ; 1. Rservation dune zone mmoire de 4 octets (la 1re libre)2. Association du nom i ladresse du dbut de la zone

    Maude Manouvrier - Univ. Paris Dauphine36

    . op e e a va eur en na re ans a zone m mo re

    &i correspond ladresse du dbut de la zone mmoire o est stocke la valeur de i

    Pointeurs (2/8)

  • 8/7/2019 introd C++

    37/86

    Pointeurs (2/8)

    Pointeur = variable contenant une adresse en mmoire

    i: 0000 0000 0000 0011

    :

    int i=10;

    int * =&i

    Maude Manouvrier - Univ. Paris Dauphine 37

  • 8/7/2019 introd C++

    38/86

    Pointeurs (4/8)

  • 8/7/2019 introd C++

    39/86

    Pointeurs (4/8)

    // Programme repris de [Delannoy,2004, Page 52]#include // ancien pour exitinclude

    using namespace std ;

    intmain()

    lon taille /* Pour que newretourne unint * adr ;

    int nbloc ;

    " "

    po n eur nu en cas c ec

    cin >> taille ;for (nbloc=1 ; ; nbloc++)

    =

    if (adr==0) { cout

  • 8/7/2019 introd C++

    40/86

    Pointeurs (5/8)

    #include // Programme repris de [Delannoy,2004, Page 53]#include // ancien pour exit#include // pour set_new_handler (parfois )

    using namespace std ;

    void deborde () ; // prototype - dclaration de la fonction

    // fonction appele en cas de manque de mmoireintmain()

    {

    set_new_handler (deborde) ;

    int * adr, nbloc ;cout > taille ;

    for (nbloc=1 ; ; nbloc++)

    { adr = new int [taille] ;

    cout

  • 8/7/2019 introd C++

    41/86

    Pointeurs (6/8)

    int *p = new int; // p est de type int*

    (*p)=3; // (*p) est de type int

    int *tab = new int [20]; // tab est de type int*

    // tab correspond ladresse du dbut de la zone mmoire

    // alloue pour contenir 20 entiers

    ta = ; qu va ent ta =

    Manipulation de pointeur :a ; ca age e a une zone m mo re e a e s zeo n

    // tab pointe sur la zone mmoire devant contenir le 2me

    // lment du tableau

    *

    // car on a dcal tab linstruction prcdente

    *(tab+1)=5; // quivalent tab[2]=5 sans dcaler tab

    -// alloue par new

    Libration de la mmoire alloue :

    Maude Manouvrier - Univ. Paris Dau hine41

    deletep;

    delete [] tab; Ne pas oublier de librer la mmoire alloue!!

  • 8/7/2019 introd C++

    42/86

    Pointeurs (8/8)

  • 8/7/2019 introd C++

    43/86

    Pointeurs (8/8)

    Pointeurs de pointeur :char c=w;

    c ar p = c; p a pour va eur a resse e c

    // (*p1) est de type char

    char **p2=&p1; // p2 a pour valeur ladresse de p1

    * *

    w

    // **p2 est de type char p1

    cout

  • 8/7/2019 introd C++

    44/86

    Fonctions

    Appel de fonction toujours prcd de la dclaration de lafonction sous la forme de prototype (signature)

    Une et une seule dfinition dune fonction donne mais autant

    de dclaration que ncessaire Passage des paramtres par valeur (comme en C) ou par

    rfrence

    Possibilit de surcharger ou sur-dfinir une fonctionint racine_carree (int x) {return x * x;}_

    Possibilit dattribuer des valeurs par dfaut aux arguments

    = =int x =10, y=20;

    MaFonction(x,y); // Appel avec 2 argumentLes arguments concerns doivent

    obligatoirement tre les derniers de la liste

    MaFonction(); // Appel sans argument

    Maude Manouvrier - Univ. Paris Dauphine

    A fixer dans la dclaration de la fonction pas

    dans sa dfinition 44

    Passage des paramtres par valeur (1/2)

  • 8/7/2019 introd C++

    45/86

    Passage des paramtres par valeur (1/2)

    void echange(int,int); // Dclaration (prototype) de la fonction// A mettre avant tout appel de la fonction

    { int n=10, p=20;

    cout

  • 8/7/2019 introd C++

    46/86

    Passage des paramtres par valeur (2/2)nc u e os ream

    void echange(int*,int*); // Modification de la signature

    // Utilisation de pointeurs

    intmain()

    { int n=10, p=20;

    cout

  • 8/7/2019 introd C++

    47/86

    Passage des paramtres par rfrence

    #include

    void echange(int&,int&); !Si on surcharge la fonction en

    incluant la fonction prenant en

    paramtre des entiers => ambigit

    intmain()

    { int n=10, p=20;

    cout

  • 8/7/2019 introd C++

    48/86

    const (1/2) Constante symbolique : const int taille = 1000;

    // Impossible de modifier taille dans la suite du programme

    const dfinit une ex ression constante = calcule la com ilation

    Utilisation de const avec des pointeurs

    onn e po n e cons an e :const char* ptr1 = "QWERTY" ;

    ptr1++; // OK

    *ptr1= A; // KO assignment to const type

    Pointeur constant :c ar cons p r = ;

    ptr1++; // KO increment of const type

    *ptr1= A; // OK

    Pointeur et donne pointe constants :const char* constptr1 = "QWERTY" ;

    *ptr1= A; // KO assignment to const typeMaude Manouvrier - Univ. Paris Dauphine repris des transparents dOlivier Carles et Frdric Darguesse 48

    const (2/2)

  • 8/7/2019 introd C++

    49/86

    const (2/2)void f (int* p2)

    {

    *p2=7; // si p1==p2, alors on change galement *p1

    }

    intmain (){

    int x=0;

    const int *p1= &x;

    int y=*p1;

    f(&x);

    if * 1!= cout

  • 8/7/2019 introd C++

    50/86

    Classes et objets (1/6) : dfinitions

  • 8/7/2019 introd C++

    51/86

    j

    Regroupement de donnes (attributs ou champs) et demthodes fonctions membres

    Extension des structures (struct) avec diffrents niveaux

    de visibilit (protected, private et public) En programmation oriente-objet pure : encapsulation des

    donnes et accs unique des donnes travers les mthodes Objet : instance de classe

    Attributs et mthodes communs tous les objets dunec asse

    Valeurs des attributs propres chaque objet

    ncapsu a on

    Caractrisation dun objet par les spcifications de ses

    Indpendance vis vis de limplmentationMaude Manouvrier - Univ. Paris Dauphine 51

    Classes et objets (2/6) : 1er exemple de classe

  • 8/7/2019 introd C++

    52/86

    Classes et objets (2/6) : 1er exemple de classe

    // Exemple de classe repris de [Deitel et Deitel, 2001]class Horaire{

    private: // dclaration des membres privs

    //private: est optionnel (priv par dfaut)int heure; // de 0 24

    intminute; // de 0 59

    n secon e; de 0 59

    public: // dclaration des membres publics

    Horaire(); // Constructeur

    void SetHoraire(int, int, int);Interface de

    la classevoidAfficherMode12h();

    voidAfficherMode24h();

    Maude Manouvrier - Univ. Paris Dauphine 52

    Classes et objets (3/6) : 1er exemple de classe

  • 8/7/2019 introd C++

    53/86

    Classes et objets (3/6) : 1er exemple de classe

    Constructeur : Mthode appele automatiquement lacration dun ob etHoraire::Horaire() {heure = minute = seconde = 0;}

    Dfinition dun constructeur Cration dun objet en passant lenombre de paramtres requis par le constructeur

    intmain()

    }

    Si on avait indiqu dans la dfinition de la classe :Horaire (int = 0, int = 0, int = 0);

    Horaire:: Horaire (int h, int m, int s){ SetHoraire(h,m,s);}

    Maude Manouvrier - Univ. Paris Dauphine 53

    D claration des objets :

    Horaire h1, h2(8), h3 (8,30), h4 (8,30,45);

    Classes et objets (4/6) : 1er exemple de classe

  • 8/7/2019 introd C++

    54/86

    Classes et objets (4/6) : 1er exemple de classe

    // Exemple repris de [Deitel et Deitel, 2001]void Horaire::SetHoraire(int h, intm, int s)

    heure = (h >= 0 && h < 24) ? h : 0 ;

    minute = (m >= 0 && m < 59) ? m : 0 ;

    }

    void Horaire::AfficherMode12h()

    {

    cout

  • 8/7/2019 introd C++

    55/86

    j ( ) p// Exemple repris de [Deitel et Deitel, 2001]

    #include "Horaire.h"

    {

    Horaire MonHoraire;

    // Erreur : lattribut Horaire::heure est priv

    MonHoraire.heure = 7;

    cout

  • 8/7/2019 introd C++

    56/86

    ,

    class Horaire{

    private : // dclaration des membres privs

    intminute; // de 0 59 int seconde; // de 0 59

    ublic : dclaration des membres ublicsHoraire(); // Constructeur

    void SetHoraire(int, int, int);

    void SetMinute(int);

    void SetSeconde(int);

    int GetHeure();

    Pour affecter des valeurs

    aux attributs privs

    int GetMinute();

    int GetSeconde();

    voidAfficherMode12h();

    des attributs privs

    vo c er o e ;};

    void Horaire::SetHeure(int h)

    56

    eure = >= && < : ;

    int Horaire:: GetHeure() {return heure;}Maude Manouvrier - Univ. Paris Dauphine

    uel ues r les de ro rammation

  • 8/7/2019 introd C++

    57/86

    uel ues r les de ro rammation

    . , .

    dans un fichier dextension .h

    2. Dfinir le corps des mthodes, le programme

    main etc. dans un fichier dextension .cpp

    (incluant le fichier .h)

    .

    4. Pour dboguer :

    Penser utiliser les commentaires et les cout

    Utiliser le dbogueur

    Maude Manouvrier - Univ. Paris Dauphine 57

    Utilisation des constantes 1/4

  • 8/7/2019 introd C++

    58/86

    Utilisation des constantes 1/4

    cout

  • 8/7/2019 introd C++

    59/86

    #

    using namespace std ;

    // dclaration dune constanteconst intmax=10; Il existe une fonctionmax :

    en on au nom es cons an es

    classMaClasse

    {

    /usr/include/c++/3.2.2/bits/stl_algobase.h:207:

    also declared as `std::max' (de gcc 3.2.2)

    public:

    MaClasse() { cout

  • 8/7/2019 introd C++

    60/86

    #include

    using namespace std ;

    // dclaration dune constante dans un espace de nomnamespaceMonEspace{const intmax=10;}

    classMaClasse

    {

    int tableau[MonEspace::max];

    pu c:

    MaClasse() { cout

  • 8/7/2019 introd C++

    61/86

    us ng namespace s ;

    // dclaration dune constanteconst intMAX=10;

    Par convention : les constantessont notes en majusculesclassMaClasse

    {

    int tableau[MAX];

    MaClasse() { cout

  • 8/7/2019 introd C++

    62/86

    Constructeurs

    Dfinition de l'initialisation d'une instance de la classe

    ppe mp c emen ou e cr a on ns ance e a c asse

    Mthode non type, pouvant tre surcharge

    Destructeur De mme nom ue la classe mais rcd d'un tilde ~

    Dfinition de la dsinitialisation d'une instance de la classe

    ' Mthode non type et sans paramtre

    Ne pouvant pas tre surcharg

    Maude Manouvrier - Univ. Paris Dauphine 62

    Notions de constructeurs et destructeur (2/7)

  • 8/7/2019 introd C++

    63/86

    // Programme repris de [Delannoy, 2004] - pour montrer

    les appels du constructeur et du destructeur

    class Exem le

    {

    public :

    int attribut;Exemple(int); // Dclaration du constructeur~Exemple(); // Dclaration du destructeur

    } ;

    Exemple::Exemple (int i) // Dfinition du constructeur{ attribut = i;

    cout

  • 8/7/2019 introd C++

    64/86

    Exem le de constructeur effectuant une allocation

    Notions de constructeurs et destructeur (4/7)

  • 8/7/2019 introd C++

    65/86

    xem le de constructeur e ectuant une allocation// dynamique repris de [Delannoy, 2004]

    class TableauDEntiers

    int nbElements;

    int * pointeurSurTableau;

    ublic:TableauDEntiers(int, int); // Constructeur

    ~ TableauDEntiers(); // Destructeur

    }

    // Constructeur allouant dynamiquement de la mmoire pour nb entiersTableauDEntiers::TableauDEntiers int nb intmax

    { pointeurSurTableau = new int [nbElements=nb] ;

    for (int i=0; i

  • 8/7/2019 introd C++

    66/86

    Constructeur par recopie (copy constructor) : Constructeur cr ar dfaut mais ouvant tre redfini

    Appel lors de linitialisation dun objet par recopie dun

    autre ob et, lors du assa e ar valeur dun ob et enargument de fonction ou en retour dun objet commeretour de fonctionMaClasse c1;

    MaClasse c2=c1; // Appel du constructeur par recopie

    oss e n r exp c emen un cons ruc eur parcopie si ncessaire :

    n seu argument e type e a c asse Transmission de largument par rfrence

    MaClasse(MaClasse &);

    MaClasse(constMaClasse &) ;Maude Manouvrier - Univ. Paris Dauphine 66

    Notions de constructeurs et destructeur (6/7)Reprise de la classe Exemple

  • 8/7/2019 introd C++

    67/86

    Reprise de la classe Exemple

    class Exemple{

    pu c :

    int attribut;

    Exemple(int); // Dclaration du constructeur

    } ;

    intmain()

    { Exemple e(1); D claration d'un objet Exemple

    Exemple e2=e; // Initialisation dun objet par recopiereturn 0;

    du constructeur par recopie :** Appel du constructeur - valeur de l'attribut = 1

    Maude Manouvrier - Univ. Paris Dauphine 67

    -

    ** Appel du destructeur - valeur de l'attribut = 1

    Notions de constructeurs et destructeur (7/7)

  • 8/7/2019 introd C++

    68/86

    class Exemple

    {public :

    int attribut;

    Exemple(int);

    // Dclaration du constructeur par recopieExemple(const Exemple &);

    ~

    // Dfinition du constructeur par recopie

    } ;

    xemp e:: xemp e cons xemp e e

    { cout

  • 8/7/2019 introd C++

    69/86

    Pro rits des mthodes 1/4

  • 8/7/2019 introd C++

    70/86

    Surcharge des mthodesa asse ; c er ;

    MaClasse(int); Afficher(char* message);

    MaClasse(int = 0); Afficher(char* = "" );

    oss e n r es m o es en gne

    inlineMaClasse::MaClasse() {corps court};

    class MaClasse

    { Dfinition de la mthode

    dans la dclaration mme

    } de la classe

    machine) dans le programme plus de gestion dappelMaude Manouvrier - Univ. Paris Dauphine 70

    Pro rits des mthodes 2/4

  • 8/7/2019 introd C++

    71/86

    Passage des paramtres objets

    Transmission par valeur

    bool Horaire::Egal(Horaire h)

    { return ((heure == h.heure) && (minute == h.minute)&& (seconde == h.seconde)) ;

    }

    intmain(){ Horaire h1, h2;

    if (h1.Egal(h2)==true)// h2 est recopi dans un emplacement// local Egal nomm h

    Appel du constructeur par recopie}

    bool Egal(const Horaire & h)

    Maude Manouvrier - Univ. Paris Dauphine 71

    Pro rits des mthodes 3/4

  • 8/7/2019 introd C++

    72/86

    Mthode retournant un objet Transmission par valeur

    Horaire Horaire::HeureSuivante()

    { Horaire h;

    if (heure

  • 8/7/2019 introd C++

    73/86

    Mthode constante

    Utilisable pour un objet dclar constant

    Pour les mthodes ne modifiant pas la valeur desobjetsclass Horaire

    void Afficher() const ;void AfficherMode12h();

    : oss e surc arger a

    mthode et dajouter la classe :Afficher();

    const Horaire h;h.Afficher // OKnh.AfficherMode12h() // KO

    // h est const mais pas la mthode!!Horaire h2;F

    oncti

    main

    h2.Afficher(); //OK

    Maude Manouvrier - Univ. Paris Dauphine 73

    Auto-rfrence

  • 8/7/2019 introd C++

    74/86

    Pointeur sur lobjet (i.e. ladresse de lobjet)

    ayant appe

    Uni uement utilisable au sein des mthodes de la

    classeHoraire::AfficheAdresse(){ cout

  • 8/7/2019 introd C++

    75/86

    Applicable aux attributs et aux mthodes Dfinition de proprit indpendante de tout objet de

    la classe proprit de la classe

    class ClasseTestStatic

    {

    public:

    // constructeur inline

    asse es a c e s ; ;

    // Affichage du membre statique inline

    voidAfficherNbObjets ()

    { cout

  • 8/7/2019 introd C++

    76/86

    // initialisation de membre statiqueint ClasseTestStatic::NbObjets=0;

    intmain ()

    {

    cout

  • 8/7/2019 introd C++

    77/86

    Notions de mthode amie : friend Fonction extrieure la classe ayant accs aux

    donnes prives de la classes

    Contraire la P.O.O. mais utile dans certain cas

    ,

    Une fonction indpendante, amie dune classe ,

    Une fonction amie de plusieurs classes

    ou es es m o es une c asse am es une au re c assefriend type_retour NomFonction (arguments) ;

    Maude Manouvrier - Univ. Paris Dauphine 77

    Surchar e do rateurs 2/5

  • 8/7/2019 introd C++

    78/86

    Possibilit en C++ de redfinir nimporte quel oprateurunaire ou binaire : = == + - * \ > ++ -- += -=, *=, /= , & etc.

    class Horaire{ bool operator== (const Horaire &);}

    bool Horaire::operator==(const Horaire& h){re urn eure== . eure m nu e ==h.minute) && (seconde == h.seconde));

    }

    Horaire h1, h2;

    nction

    ain

    Maude Manouvrier - Univ. Paris Dauphine 78

    Fo

    Surchar e do rateurs 3/5

  • 8/7/2019 introd C++

    79/86

    class Horaire{

    friendbool operator== (const Horaire &, const

    Horaire &); // fonction amie

    }

    bool operator==(const Horaire& h1, const

    Horaire& h2)

    {

    return((h1.heure==h2.heure) && (h1.minute ==h2.minute && h1.seconde == h2.seconde

    }

    ,

    if (h1==h2) Fonctio

    main comme :

    une mthode un argument

    Maude Manouvrier - Univ. Paris Dauphine 79

    une onc on r en argumen s

    jamais les deux la fois

    Surchar e do rateurs 4/5

  • 8/7/2019 introd C++

    80/86

    class Horaire{ // Pas de fonction friend ici pour loprateur ==

    }

    // Fonction extrieure la classe

    bool operator==(const Horaire& h1, const Horaire& h2)

    {

    return((h1.GetHeure()==h2.GetHeure()) &&

    (h1.GetMinute() == h2.GetMinute()) &&

    (h1.GetSeconde() == h2.GetSeconde()) );

    Horaire h1, h2;tion

    in

    if (h1==h2) Fon ma

    Maude Manouvrier - Univ. Paris Dauphine 80

    Surchar e do rateurs 5/5

  • 8/7/2019 introd C++

    81/86

    class Horaire{

    const Horaire& operator= (const Horaire &);

    }

    const Horaire& Horaire::operator=(const Horaire& h)

    {

    heure=h.heure;

    minute = h.minute;

    seconde= h.seconde;return *this

    }

    , , ,

    h2=h1; Fonctio

    main

    Maude Manouvrier - Univ. Paris Dauphine 81

    Copy constructeur vs. Oprateur

  • 8/7/2019 introd C++

    82/86

    daffectationa asse c;

    MaClasse c1=c; // Appel au copy constructeur!

    MaClasse c2;

    c2=c1; // Appel de loprateur daffectation!

    // Si la mthode Egal a t dfinie par :// bool Egal(MaClasse c);

    c . ga c ; Appel du copy constructeur!// c2 est recopi dans c

    // Si lo rateur == a t surchar ar :

    // bool operator==(MaClasse c);if(c1==c2) ; // Appel du copy constructeur!

    c1.o erator== c2// c2 est recopi dans c

    Maude Manouvrier - Univ. Paris Dauphine 82

    Ob et membre 1/4

  • 8/7/2019 introd C++

    83/86

    Possibilit de crer une classe avec un membree ype o e une c asse

    // exemple repris de [Delannoy, 2004]

    c asspo nt{int abs, ord ;

    pu c :point(int,int);

    };

    class cercle{point centre; // membre instance de la classe point

    int rayon;public :

    cercle (int, int, int);};

    Maude Manouvrier - Univ. Paris Dauphine 83

    Ob et membre 2/4

  • 8/7/2019 introd C++

    84/86

    #include "ObjetMembre.h"point::point(int x=0, int y=0)

    {

    abs=x; ord=y;

    cout

  • 8/7/2019 introd C++

    85/86

    cercle::cercle(int abs, int ord, int ray){

    rayon=ray;

    // Attention : Cration dun objet temporaire point// et Appel de loprateur =

    centre = po nt a s,or ;cout

  • 8/7/2019 introd C++

    86/86

    objet membre pour nimporte quel membre (ex. des attributs de typeentier) :

    classpoint{ int abs, ord ;public :

    n a sa on es mem res a s e or avec // les valeurs de x et y

    point (int x=0, inty=0) : abs(x), ord(y) {};

    Syntaxe indispensable en cas de membre donne constant ou de membredonne de type rfrence :

    class Exemple{ const int n;

    ublic :

    Exemple();};

    // Impossible de faire n=3; dans le corps du constructeur// n est un membre (attribut) constant!!Exemple::Exemple() : n(3) {}

    Maude Manouvrier - Univ. Paris Dauphine adapt de [Delannoy, 2004] 86