View
240
Download
1
Category
Preview:
Citation preview
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
Recommended