techniques de conception et de programmation en langage...

52
Techniques de Techniques de conception et de conception et de programmation en programmation en Langage C++ Langage C++ IFIPS 2 EI IFIPS 2 EI 2006/2007 2006/2007 Marius VASILIU Marius VASILIU

Upload: others

Post on 30-Mar-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Techniques de Techniques de

conception et de conception et de

programmation en programmation en

Langage C++Langage C++

IFIPS 2 EIIFIPS 2 EI

2006/20072006/2007

Marius VASILIUMarius VASILIU

Page 2: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

OrganisationOrganisation�� 10 cours 10 cours -- TP intégrés : présence obligatoireTP intégrés : présence obligatoire

�� 1 examen sur machine 31 examen sur machine 3--4 heures4 heures

�� Exercices Exercices enen cours et cours et entreentre les cours (obligatoires)les cours (obligatoires)

�� Travail sous Visual C++ 6.0 et MSDNTravail sous Visual C++ 6.0 et MSDN

�� Répertoires de travail recommandés :Répertoires de travail recommandés :z:z:\\tptp__cppcpp\\ccNN où où NN est le numéro de la séanceest le numéro de la séance

�� On recommande unOn recommande un workspaceworkspace unique (unique (ccNN..dswdsw) ) pour tous les projets pour tous les projets exo1exo1, , exo2exo2... d'une séance... d'une séance

�� Répertoires pour recueillir les exos :Répertoires pour recueillir les exos :\\\\groseillegroseille\\examenexamen\\eii08eii08\\cppcpp\\exosexos\\<compte><compte>

Page 3: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

OrganisationOrganisation

�� Répertoire de partage: Répertoire de partage: \\\\groseillegroseille\\echangeechange\\eii08eii08\\

�� Aide et documentation :Aide et documentation :

–– un livre/cours C++ de Christian un livre/cours C++ de Christian Casteyde Casteyde traduit en traduit en français : français : cours_cours_cppcpp\\book1.book1.htmlhtml

–– les exercices projetés au tableaules exercices projetés au tableau

–– les transparents du cours (à la fin de chaque cours)les transparents du cours (à la fin de chaque cours)

–– livre "livre "Langage C++Langage C++" M. " M. Vasiliu Vasiliu chez Pearson Education chez Pearson Education dans la collectiondans la collection SyntexSyntex

–– Help MSDN Help MSDN -- Visual C++Visual C++

–– Livre électronique : Livre électronique : Wrox Press Wrox Press C++ TutorialC++ Tutorial

Page 4: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Sommaire du coursSommaire du cours

�� Introduction, extensions C++ : références, etc.Introduction, extensions C++ : références, etc.

�� Données en C++ : types, durée de vie, allocationDonnées en C++ : types, durée de vie, allocation

�� EncapsulationEncapsulation, approche objet, droits d'accès, approche objet, droits d'accès

�� Attributs, méthodes, constructeurs et destructeurAttributs, méthodes, constructeurs et destructeur

�� Instances et membres statiques, Instances et membres statiques, thisthis

�� Héritage simple, multiple, virtuelHéritage simple, multiple, virtuel

�� Polymorphisme statique et dynamique Polymorphisme statique et dynamique

�� TemplatesTemplates (patrons) de classes et fonctions(patrons) de classes et fonctions

�� Gestion des exceptionsGestion des exceptions

Page 5: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Origines et approche C++Origines et approche C++

�� Extension syntactiqueExtension syntactique du langage Cdu langage C

�� Dernières définitions: ANSI/ISO 1995,1998Dernières définitions: ANSI/ISO 1995,1998

�� Un compilateur C++ Un compilateur C++ compile aussicompile aussi du Cdu C

�� Principale extension : Principale extension : les classesles classes

�� Différence importante dans l’Différence importante dans l’approcheapproche de de programmation / programmation / architecturearchitecture du programmedu programme

�� Compréhension du langage = compréhension Compréhension du langage = compréhension de la de la réalité «réalité « physiquephysique »» des donnéesdes données

(condition essentielle pour l'info. industrielle)(condition essentielle pour l'info. industrielle)

Page 6: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Extensions C++Extensions C++

�� Allocation dynamique (Allocation dynamique (newnew etet deletedelete))

�� Nouveau type d’accès : Nouveau type d’accès : la référencela référence

�� Fonctions : Fonctions : décorationdécoration et paramètres et paramètres par défautpar défaut

�� SurchargeSurcharge des opérateursdes opérateurs

�� Flux dFlux d ’entrée / sortie C++ (’entrée / sortie C++ (streamsstreams))

�� Classes / objetsClasses / objets : :

–– encapsulationencapsulation

–– héritagehéritage

–– polymorphismepolymorphisme

�� Gestion des Gestion des exceptionsexceptions

Page 7: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde
Page 8: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Comment le rendre Comment le rendre opérationnel ?opérationnel ?

*.h*.h

*.h*.h

*.h*.h

*.*.cppcpp

*.*.cppcpp

*.*.cppcpp

Page 9: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Comment le rendre Comment le rendre opérationnel ?opérationnel ?

*.h*.h

*.h*.h

*.h*.h

*.*.cppcpp

*.*.cppcpp

*.*.cppcpp

*.*.objobj

*.*.objobj

*.*.objobj

*.*.liblib

Page 10: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Comment le rendre Comment le rendre opérationnel ?opérationnel ?

*.h*.h

*.h*.h

*.h*.h

*.*.cppcpp

*.*.cppcpp

*.*.cppcpp

*.*.objobj

*.*.objobj

*.*.objobj

*.*.liblib

*.*.exeexe

Page 11: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Comment le rendre Comment le rendre opérationnel ?opérationnel ?

*.h*.h

*.h*.h

*.h*.h

*.*.cppcpp

*.*.cppcpp

*.*.cppcpp

*.*.objobj

*.*.objobj

*.*.objobj

*.*.liblib

*.*.exeexe

*.*.dlldll

*.*.syssys*.*.axax

Page 12: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Co

mm

en

t

fa

it

Co

mm

en

t

fa

it

--

il

il

(r

ée

ll

em

en

t)

?

(r

ée

ll

em

en

t)

?

��

Le

p

ro

gr

am

me

e

ff

ec

tu

e

le

s

ac

ti

on

s

si

es

p

ar

l

e

Le

p

ro

gr

am

me

e

ff

ec

tu

e

le

s

ac

ti

on

s

si

es

p

ar

l

e

pro

gra

mm

eu

r e

n

s'e

cu

tan

t d

an

s

un

O

S

cib

le.

pro

gra

mm

eu

r e

n

s'e

cu

tan

t d

an

s

un

O

S

cib

le.�

�Po

ur

c

el

a

il

f

au

t

av

oi

r

un

Po

ur

c

el

a

il

f

au

t

av

oi

r

un

fi

ch

er

e

cu

ta

bl

e

fi

ch

er

e

cu

ta

bl

e

ob

te

nu

ob

te

nu

p

ar

c

om

pi

la

ti

on

e

t

éd

it

io

n

de

l

ie

ns

(

pa

r

co

mp

il

at

io

n

et

é

di

ti

on

d

e

li

en

s

(l

in

k

li

nk

)

)�E

cu

ta

bl

e

=

Ex

éc

ut

ab

le

=

s

eg

me

nt

d

e

co

de

se

gm

en

t

de

c

od

e

+

+

se

g

se

g

. d

e d

on

es

. d

e d

on

es

��

Se

gm

en

t

de

c

od

e

=

in

st

ru

ct

io

ns

a

ss

em

bl

eu

r

Se

gm

en

t

de

c

od

e

=

in

st

ru

ct

io

ns

a

ss

em

bl

eu

r(

il

n

'y

a

p

as

d

'i

nt

er

pr

ét

at

io

n

ni

d

e

ma

ch

in

e

vi

rt

ue

ll

e)

(i

l

n'

y

a

pa

s

d'

in

te

rp

ta

ti

on

n

i

de

m

ac

hi

ne

v

ir

tu

el

le

)

��

Ex

éc

ut

io

n

pa

r

un

/p

lu

si

eu

rs

P

de

s

in

st

ru

ct

io

ns

Ex

éc

ut

io

n

pa

r

un

/p

lu

si

eu

rs

P

de

s

in

st

ru

ct

io

ns

a

sse

mb

leu

r e

n

mo

de

e

xclu

sif

ou

e

n

mêm

e

tem

ps

asse

mb

leu

r e

n

mo

de

e

xclu

sif

ou

e

n

mêm

e

tem

ps

qu

e

d’

au

tr

es

p

ro

gr

am

me

s.

qu

e

d’

au

tr

es

p

ro

gr

am

me

s.

Page 13: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Exécution sous l'OS cibleExécution sous l'OS cible

Programme Programme Programme

Système d'exploitation

� � � �

soussous--systèmesystèmeconsoleconsole

soussous--systèmesystèmegraphique (GUI)graphique (GUI)

autresautressoussous--systèmessystèmes

Page 14: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Pour bien maîtriser lesPour bien maîtriser lesvariables (objets), il faut ...variables (objets), il faut ...

�� Savoir que le C++ est un Savoir que le C++ est un langage typélangage typé : toute : toute variable et toute expression ont un (variable et toute expression ont un (uniqueunique) type) type

�� Ne jamais confondre un Ne jamais confondre un typetype avec une avec une variablevariable !!

�� Savoir que toute variable occupe Savoir que toute variable occupe une place mémoireune place mémoirede la taille du type pendant sa durée de viede la taille du type pendant sa durée de vie

�� Savoir quelle est la Savoir quelle est la durée de viedurée de vie d'une variabled'une variable

�� Savoir dans Savoir dans quel espacequel espace mémoire vie la variablemémoire vie la variable

�� Savoir Savoir oùoù et et commentcomment une variable est accessibleune variable est accessible

�� Savoir si l'évaluation d'une expression mène vers une Savoir si l'évaluation d'une expression mène vers une variable (un conteneur) ou non: variable (un conteneur) ou non: ll--valuevalue et et rr--valuevalue..

Page 15: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Architecture mémoireArchitecture mémoiresoussous--entendue par le C++entendue par le C++

fonctionsfonctions

méthodesméthodes

donnéesdonnéesinitialiséesinitialisées

donnéesdonnéesnonnon--initialiséesinitialisées

utiliséeutilisée

nonnon--utiliséeutilisée

Segment de Segment de codecode

Code Code

segmentsegment

SegmentSegmentde donnéesde données

DataData

segmentsegment

PilePileStackStack

utiliséutilisé

nonnon--utiliséutilisé

TasTasHeapHeap

utiliséutilisé

nonnon--utiliséutilisé

utiliséutilisé

Page 16: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Données Données -- Emplacement par Emplacement par défaut (sans optimisation)défaut (sans optimisation)

�� Segment de donnéesSegment de données

–– variables globales et statiquesvariables globales et statiques

�� Pile (Pile (stackstack))

–– variables locales, temporairesvariables locales, temporaires

–– paramètres d’appel et retour de fonctions / méthodesparamètres d’appel et retour de fonctions / méthodes

�� Registres µPRegistres µP ((VisualCVisualC++ ++ �� pilepile))

–– variables précédées par le mot clévariables précédées par le mot clé registerregister

�� Tas (Tas (heapheap))

–– variables dynamiques (sans nom !)variables dynamiques (sans nom !)

Page 17: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Données Données -- Emplacement suite Emplacement suite à l'optimisation (à l'optimisation (ReleaseRelease))

�� Segment de donnéesSegment de données

–– variables globales et statiquesvariables globales et statiques

�� Pile (Pile (stackstack))

–– variables locales, temporairesvariables locales, temporaires

–– paramètres dparamètres d ’appel et retour de fonctions / méthodes’appel et retour de fonctions / méthodes

�� Registres µPRegistres µP

–– toute variable locale, temporaire ou paramètre de toute variable locale, temporaire ou paramètre de fonction fonction inin--lineline que le compilateur considère nécessaireque le compilateur considère nécessaire

�� Tas (Tas (heapheap))

–– variables dynamiques (sans nom !)variables dynamiques (sans nom !)

Page 18: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Types disponiblesTypes disponibles

�� Types scalaires numériques natifsTypes scalaires numériques natifs

–– Taille en mémoire: 1, 2, 4, 8, 10, 16 octetsTaille en mémoire: 1, 2, 4, 8, 10, 16 octets

–– Présence d’un signe: signé / nonPrésence d’un signe: signé / non--signésigné

–– Granularité : booléen, entier, réelGranularité : booléen, entier, réel

�� Types scalaires d’adressageTypes scalaires d’adressage

(permettent d’accéder à une variable en mémorisant (permettent d’accéder à une variable en mémorisant son adresse)son adresse)

–– Pointeur : Pointeur : une adresse, un typeune adresse, un type et une taille.et une taille.

–– Référence : une adresse,Référence : une adresse, un type, une variable à un type, une variable à «cloner»«cloner» et une tailleet une taille

Page 19: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Types disponibles par Types disponibles par agrégationagrégation

�� Homogènes (vecteur d'éléments = tableau)Homogènes (vecteur d'éléments = tableau)

(une matrice 2D est un vecteur de vecteurs de …)(une matrice 2D est un vecteur de vecteurs de …)

–– Type de l'élément (qui est une donnée …)Type de l'élément (qui est une donnée …)

–– Nombre d’éléments (à la création !)Nombre d’éléments (à la création !)

–– Adresse du premier élémentAdresse du premier élément

�� Hybrides (structures, unions, classes)Hybrides (structures, unions, classes)

–– Liste de champs/attributsListe de champs/attributs (qui sont des données)(qui sont des données)�� Nom, type, droit d’accèsNom, type, droit d’accès

�� Pour entiers: taille en bits (champs de bits)Pour entiers: taille en bits (champs de bits)

–– Pour classes: Pour classes: liste et nom des méthodesliste et nom des méthodes (qui (qui par par défautdéfaut ne sont pas de données …)ne sont pas de données …)

Page 20: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Références Références -- DéclarationDéclaration

�� La référence est un alias pour la variable à La référence est un alias pour la variable à laquelle elle est associéelaquelle elle est associée

�� On ne peut jamais déclarer une référence sans On ne peut jamais déclarer une référence sans l'associer à une variable (par l'attribution à la l'associer à une variable (par l'attribution à la déclaration) :déclaration) :

type_ttype_t& & referencereference = = var_ou_var_ou_refref_de_type_t_de_type_t ;;

�� Exemple :Exemple :void void mainmain{{

int int i, j=10;i, j=10;intint& ri=i; & ri=i; int int &ri2 = ri;&ri2 = ri;// afficher les valeurs de i et ri// afficher les valeurs de i et ri// afficher l'adresse de i et ri// afficher l'adresse de i et ri

}}

Page 21: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Références Références -- UtilisationUtilisation

�� On peut utiliser partout une référence à la On peut utiliser partout une référence à la place de sa variable associée (le type est le place de sa variable associée (le type est le même à l'évaluation !)même à l'évaluation !)

�� Copiez, modifiez la variable, puis la référence Copiez, modifiez la variable, puis la référence et affichez les résultats.et affichez les résultats.

�� La référence cache en réalité un pointeur vers La référence cache en réalité un pointeur vers la variable associée. La référence d'une la variable associée. La référence d'une variable variable varvar vaut toujours vaut toujours *(&var)*(&var) ..

�� PeutPeut--on avoir l'adresse d'une référence ?on avoir l'adresse d'une référence ?

�� PeutPeut--on modifier la variable associée ?on modifier la variable associée ?

Page 22: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Passage de paramètresPassage de paramètrespar référencepar référence

�� Si un paramètre formel d'une fonction est une Si un paramètre formel d'une fonction est une référence alors à l'appel on se retrouve avec la référence alors à l'appel on se retrouve avec la référence du paramètre d'appel :référence du paramètre d'appel :

double Add1(double Add1(float float a, short b)a, short b){{

return a+b;return a+b;}}voidvoid Add2(Add2(floatfloat a, short b, doublea, short b, double resres)){{

resres=a+b;=a+b;}}voidvoid Add3(Add3(floatfloat a, short b, double& a, short b, double& resres)){{

resres=a+b;=a+b;}}

Page 23: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde
Page 24: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Tableaux (à taille fixe)Tableaux (à taille fixe)�� Par déclaration, comme variables locales, Par déclaration, comme variables locales,

globales ou statiques. Pourquoi une taille fixe ?globales ou statiques. Pourquoi une taille fixe ?

�� Entant que paramètre de fonction il n'est pas Entant que paramètre de fonction il n'est pas copié dans la pile !copié dans la pile !

�� L'opérateurL'opérateur sizeofsizeof donne sa vraie tailledonne sa vraie taille

�� Il n'y a pas des tableaux 2D ou ND :Il n'y a pas des tableaux 2D ou ND :void void mainmain{{

int int tab1[3][5]; // emplacement, architecture ?tab1[3][5]; // emplacement, architecture ?// quel // quel typetype? est? est--ce une ce une ll-- ou ou rr--valuevalue ? ? // tab1// tab1// tab1[1]// tab1[1]// (tab1+1)// (tab1+1)// *(tab1+1)// *(tab1+1)// tab1[0][3]// tab1[0][3]

}}

Page 25: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Données Données -- Durée de vieDurée de vie

��EntreEntre la création = l’allocation de la mémoire la création = l’allocation de la mémoire etet la destruction = la libération de la mémoirela destruction = la libération de la mémoire

�� Globales et/ou StatiquesGlobales et/ou Statiques–– toute la durée d’exécution du programmetoute la durée d’exécution du programme

�� LocalesLocales–– de la déclaration jusqu’à la fin «de la déclaration jusqu’à la fin « }} » du bloc» du bloc

�� Temporaires et adTemporaires et ad--hochoc–– jusqu'à la fin de l'instruction courante «jusqu'à la fin de l'instruction courante « ;; » »

�� Paramètres d'appel et de retourParamètres d'appel et de retour–– pendant la durée d’appel de la fonctionpendant la durée d’appel de la fonction

�� DynamiquesDynamiques–– entre création (entre création (newnew) et destruction () et destruction (deletedelete))

Page 26: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Allocation dynamiqueAllocation dynamique

�� En C++ on utilise pratiquement jamais En C++ on utilise pratiquement jamais mallocmalloc et et freefree. A leur place on utilise les opérateurs . A leur place on utilise les opérateurs newnewpour la création et pour la création et deletedelete pour la destruction.pour la destruction.

�� L'opérateur L'opérateur newnew retourne un pointeur vers retourne un pointeur vers uneunevariable du type demandé allouée dans le tas :variable du type demandé allouée dans le tas :

type_ttype_t* * ptr1ptr1=new =new type_ttype_t; //C++; //C++type_ttype_t* * ptr2ptr2=(=(type_ttype_t*)*)mallocmalloc((sizeofsizeof((type_ttype_t));//C));//C

�� L'opérateur L'opérateur new []new [] retourne un pointeur vers retourne un pointeur vers NNvariables du type demandé allouées dans le tas :variables du type demandé allouées dans le tas :

type_ttype_t* ptr1=new * ptr1=new type_ttype_t[[exprexpr__entiereentiere]; //C++]; //C++type_ttype_t* ptr2=(* ptr2=(type_ttype_t*)*)mallocmalloc((

sizeofsizeof((type_ttype_t)*)*exprexpr__entiereentiere); //C); //C

Page 27: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Allocation dynamiqueAllocation dynamique

�� L'opérateur L'opérateur deletedelete libère la place occupée par libère la place occupée par lalavariable pointé par le pointeur passé en variable pointé par le pointeur passé en paramètre :paramètre :

deletedelete ptr1ptr1; //C++; //C++free(free(ptr2ptr2); //C); //C

�� L'opérateur L'opérateur deletedelete [][] libère la place occupée par libère la place occupée par les les NN variables pointées par le pointeur passé en variables pointées par le pointeur passé en paramètre :paramètre :

deletedelete[] [] ptr1ptr1; //C++; //C++free(free(ptr2ptr2); //C); //C

Page 28: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Allocation dynamiqueAllocation dynamiqueAttention !Attention !

�� Le pointeur qui accueille l'adresse de Le pointeur qui accueille l'adresse de newnew est est votre seul lien avec la (les) variable(s) allouée(s) votre seul lien avec la (les) variable(s) allouée(s)

�� Ne modifiez pas ce pointeur car il faut le passer à Ne modifiez pas ce pointeur car il faut le passer à deletedelete pour libérer la mémoirepour libérer la mémoire

�� C'est à vous de mémoriser le nombre d'éléments C'est à vous de mémoriser le nombre d'éléments alloués, il n'y a pas d'autre moyen pour retrouver alloués, il n'y a pas d'autre moyen pour retrouver l'information.l'information.

�� Le pointeur n'est pas modifié après la libération, Le pointeur n'est pas modifié après la libération, il garde toujours l'adresse qui maintenant est il garde toujours l'adresse qui maintenant est invalide !invalide !

Page 29: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Allo

ca

tion

d

yn

am

iqu

e

Allo

ca

tion

d

yn

am

iqu

eE

xe

mp

le

s

Ex

em

pl

es

-E

xo

s

Ex

os

�Al

lo

ca

ti

on

,

ut

il

is

at

io

n

et

l

ib

ér

at

io

n

d'

un

t

ab

le

au

d

e

Al

lo

ca

ti

on

,

ut

il

is

at

io

n

et

l

ib

ér

at

io

n

d'

un

t

ab

le

au

d

e

do

ub

le

s

:

do

ub

le

s

:

vo

id

vo

id

te

st

1(

te

st

1(

in

t

in

tt

ai

ll

e)

ta

il

le

)

{

do

ub

le

*

ta

bd

ta

bd

=

ne

w

do

ub

le

[

=

ne

w

do

ub

le

[t

ab

d

ta

bd

];

];

fo

r(

fo

r(

in

t

i=

0;

i

<t

ai

ll

e;

i

++

)t

ab

d

ta

bd

[i

]=

ra

nd

()

/1

10

2;

[i

]=

ra

nd

()

/1

10

2;

de

le

te

de

le

te

[]

[]

ta

bd

ta

bd

;}

}

�Te

st

ez

l

a

fo

nc

ti

on

e

t

de

ss

in

er

l

'e

mp

la

ce

me

nt

d

e

Te

st

ez

l

a

fo

nc

ti

on

e

t

de

ss

in

er

l

'e

mp

la

ce

me

nt

d

e

ch

aq

ue

v

ar

ia

bl

e.

ch

aq

ue

v

ar

ia

bl

e.

�E

cr

ir

e

un

e

fo

nc

ti

on

q

ui

a

ll

ou

e

un

e

ma

tr

ic

e

2D

d

e

Ec

ri

re

u

ne

f

on

ct

io

n

qu

i

al

lo

ue

u

ne

m

at

ri

ce

2

D

de

ta

il

le

v

ou

lu

e.

Page 30: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Allocation dynamiqueAllocation dynamiqueExemples Exemples -- ExosExos

�� Ecrire une fonction qui alloue une matrice 2D Ecrire une fonction qui alloue une matrice 2D d'entiers signés de taille voulue et une autre qui d'entiers signés de taille voulue et une autre qui la libère :la libère :

–– il faut passer par un tableau de pointeurs pour les il faut passer par un tableau de pointeurs pour les lignes ou pour les colonnes.lignes ou pour les colonnes.

–– testez la matrice dans le programme principal, en testez la matrice dans le programme principal, en comparant son utilisation à une matrice 2D locale comparant son utilisation à une matrice 2D locale (initialisation et affichage).(initialisation et affichage).

–– dessiner l'emplacement des variables en mémoire et dessiner l'emplacement des variables en mémoire et leurs relations (architecture de données).leurs relations (architecture de données).

�� Même type de programme pour le triangle de Même type de programme pour le triangle de Pascal.Pascal.

Page 31: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Architecture de donnéesArchitecture de données

�� 2 approches, une seule conforme aux demandes :2 approches, une seule conforme aux demandes :

intint** intint

intint

intint

intint

intint

intint

intint

intint

intint

pilepile tastas

NxMNxM

intint****

intint**

pilepile tastas

NN

intint

intint

intint

intint

MM

intint** intint** intint** intint** intint**

intint

intint

intint

intint

intint

intint

intint

intint

intint

intint

intint

intint

intint

intint

intint

intint

intint

intint

intint

intint

Page 32: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Données Données -- PortéePortéeAccessibilitéAccessibilité (lire / écrire)(lire / écrire)

�� DirecteDirecte

–– par le nom de la variable ( = visibilité )par le nom de la variable ( = visibilité )�� Globales:Globales: dans le module courant et dans les autres à dans le module courant et dans les autres à

partir de la partir de la redéclarationredéclaration avec avec externextern

�� Globales statiques:Globales statiques: dans le module courantdans le module courant

�� Locales:Locales: jusqu’au bout du bloc courantjusqu’au bout du bloc courant

�� Paramètres:Paramètres: à l’intérieur de la fonction appeléeà l’intérieur de la fonction appelée

�� Dynamiques, retour Dynamiques, retour ouou temporaires:temporaires: jamais (pas de nom !)jamais (pas de nom !)

�� Une variable peut en cacher une autre !Une variable peut en cacher une autre !�� (Statiques)(Statiques)LocalesLocales > > ParamètresParamètres > > AttributsAttributs > > GlobalesGlobales

�� Espaces : Espaces : blocbloc < < fonctionfonction//méthodeméthode < < classeclasse < < namespacenamespace< < modulemodule < < programmeprogramme

Page 33: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Données Données -- PortéePortéeAccessibilitéAccessibilité (lire / écrire)(lire / écrire)

�� Indirecte Indirecte : en évaluant une expression qui vaut : en évaluant une expression qui vaut la variable en questionla variable en question

–– par adresse : pointeur ou référencepar adresse : pointeur ou référence

–– dans une structure/classe/union : par dans une structure/classe/union : par .. ou ou -->>

–– dans un tableau : arithmétique des pointeurs dans un tableau : arithmétique des pointeurs **,,++,,--,,[][]

–– accès à un autre espace par l'opérateur de résolution accès à un autre espace par l'opérateur de résolution de portée de portée ::::

–– la complexité d'une expression n'a pas de limites la complexité d'une expression n'a pas de limites

�� Danger si l’original n’existe pas ou n’existe plus :Danger si l’original n’existe pas ou n’existe plus :�� le langage C++ ne garanti pas que l'évaluation d'une le langage C++ ne garanti pas que l'évaluation d'une

expression mène vers une location mémoire valide, ceci est la expression mène vers une location mémoire valide, ceci est la responsabilité du concepteur !responsabilité du concepteur !

Page 34: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Fonctions/méthodes Fonctions/méthodes -- PortéePortéeAccessibilitéAccessibilité (appel)(appel)

�� DirecteDirecte

–– par le nom de la fonction / méthodes et par le nom de la fonction / méthodes et ()()

–– le nom seul d'une fonction est une adresse dont le le nom seul d'une fonction est une adresse dont le type est déterminé par le prototype de la fonctiontype est déterminé par le prototype de la fonction

�� IndirecteIndirecte

–– expression dont l'évaluation mène à l'adresse d'une expression dont l'évaluation mène à l'adresse d'une fonction puis appel avec fonction puis appel avec ()()

–– pour une méthode il est impératif d'avoir comme pour une méthode il est impératif d'avoir comme expression un objet (ou adresse d'objet) valide, puis expression un objet (ou adresse d'objet) valide, puis l'opérateur d'accès l'opérateur d'accès .. ou ou -->> et appel avec et appel avec ()()

Page 35: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Données Données -- AccessibilitéAccessibilité

static int static int i1=30;i1=30;

double d2=3.14;double d2=3.14;

float fnfloat fn((float float f1)f1)

{{

char c=’d’;char c=’d’;

addadd(&i1,((&i1,(intint)c);)c);

return f1;return f1;

}}

long var2=78;long var2=78;

void void main()main()

{{

}}

extern extern double d2;double d2;

void addvoid add((intint **papa,,intint b)b)

{{

long var2=32145;long var2=32145;

for(for(int int i=0;i<10;i++)i=0;i<10;i++)

{{

double d2=i;double d2=i;

d2+=*d2+=*papa;;

}}

var2=d2;var2=d2;

}}

main.main.cppcpp prog2.prog2.cppcpp

Page 36: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Données Données -- AccessibilitéAccessibilité

static int static int i1=30;i1=30;

double d2=3.14;double d2=3.14;

float fnfloat fn((float float f1)f1)

{{

char c=’d’;char c=’d’;

addadd(&i1,((&i1,(intint)c);)c);

return f1;return f1;

}}

long var2=78;long var2=78;

void void main()main()

{{

}}

extern extern double d2;double d2;

void addvoid add((intint **papa,,intint b)b)

{{

long var2=32145;long var2=32145;

for(for(int int i=0;i<10;i++)i=0;i<10;i++)

{{

double d2=i;double d2=i;

d2+=*d2+=*papa;;

}}

var2=d2;var2=d2;

}}

main.main.cppcpp prog2.prog2.cppcpp

Page 37: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Données Données -- AccessibilitéAccessibilité

static int static int i1=30;i1=30;

double d2=3.14;double d2=3.14;

float fnfloat fn((float float f1)f1)

{{

char c=’d’;char c=’d’;

addadd(&i1,((&i1,(intint)c);)c);

return f1;return f1;

}}

long var2=78;long var2=78;

void void main()main()

{{

}}

extern extern double d2;double d2;

void addvoid add((intint **papa,,intint b)b)

{{

long var2=32145;long var2=32145;

for(for(int int i=0;i<10;i++)i=0;i<10;i++)

{{

double d2=i;double d2=i;

d2+=*d2+=*papa;;

}}

var2=d2;var2=d2;

}}

main.main.cppcpp prog2.prog2.cppcpp

Page 38: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Données Données -- AccessibilitéAccessibilité

static int static int i1=30;i1=30;

double d2=3.14;double d2=3.14;

float fnfloat fn((float float f1)f1)

{{

char c=’d’;char c=’d’;

addadd(&i1,((&i1,(intint)c);)c);

return f1;return f1;

}}

long var2=78;long var2=78;

void void main()main()

{{

}}

extern extern double d2;double d2;

void addvoid add((intint **papa,,intint b)b)

{{

long var2=32145;long var2=32145;

for(for(int int i=0;i<10;i++)i=0;i<10;i++)

{{

double d2=i;double d2=i;

d2+=*d2+=*papa;;

}}

var2=d2;var2=d2;

}}

main.main.cppcpp prog2.prog2.cppcpp

Page 39: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Données Données -- AccessibilitéAccessibilité

static int static int i1=30;i1=30;

double d2=3.14;double d2=3.14;

float fnfloat fn((float float f1)f1)

{{

char c=’d’;char c=’d’;

addadd(&i1,((&i1,(intint)c);)c);

return f1;return f1;

}}

long var2=78;long var2=78;

void void main()main()

{{

}}

extern extern double d2;double d2;

void addvoid add((intint **papa,,intint b)b)

{{

long var2=32145;long var2=32145;

for(for(int int i=0;i<10;i++)i=0;i<10;i++)

{{

double d2=i;double d2=i;

d2+=*d2+=*papa;;

}}

var2=d2;var2=d2;

}}

main.main.cppcpp prog2.prog2.cppcpp

Page 40: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Données Données -- AccessibilitéAccessibilité

static int static int i1=30;i1=30;

double d2=3.14;double d2=3.14;

float fnfloat fn((float float f1)f1)

{{

char c=’d’;char c=’d’;

addadd(&i1,((&i1,(intint)c);)c);

return f1;return f1;

}}

long var2=78;long var2=78;

void void main()main()

{{

}}

extern extern double d2;double d2;

void addvoid add((intint **papa,,intint b)b)

{{

long var2=32145;long var2=32145;

for(for(int int i=0;i<10;i++)i=0;i<10;i++)

{{

double d2=i;double d2=i;

d2+=*d2+=*papa;;

}}

var2=d2;var2=d2;

}}

main.main.cppcpp prog2.prog2.cppcpp

Page 41: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Données Données -- AccessibilitéAccessibilité

static int static int i1=30;i1=30;

double d2=3.14;double d2=3.14;

float fnfloat fn((float float f1)f1)

{{

char c=’d’;char c=’d’;

addadd(&i1,((&i1,(intint)c);)c);

return f1;return f1;

}}

long var2=78;long var2=78;

void void main()main()

{{

}}

extern extern double d2;double d2;

externextern long var2;long var2;

void addvoid add((intint **papa,,intint b)b)

{{

long var2=32145;long var2=32145;

for(for(int int i=0;i<10;i++)i=0;i<10;i++)

{{

double d2=i;double d2=i;

d2+=*d2+=*papa;;

}}

var2=d2;var2=d2;

}}

main.main.cppcpp prog2.prog2.cppcpp

Page 42: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Données Données -- AccessibilitéAccessibilité

static int static int i1=30;i1=30;

double d2=3.14;double d2=3.14;

float fnfloat fn((float float f1)f1)

{{

char c=’d’;char c=’d’;

addadd(&i1,((&i1,(intint)c);)c);

return f1;return f1;

}}

long var2=78;long var2=78;

void void main()main()

{{

}}

extern extern double d2;double d2;

void addvoid add((intint **papa,,intint b)b)

{{

long var2=32145;long var2=32145;

for(for(int int i=0;i<10;i++)i=0;i<10;i++)

{{

double d2=i;double d2=i;

d2+=*d2+=*papa;;

}}

var2=d2;var2=d2;

}}

main.main.cppcpp prog2.prog2.cppcpp

Page 43: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Données Données -- AccessibilitéAccessibilité

static int static int i1=30;i1=30;

double d2=3.14;double d2=3.14;

float fnfloat fn((float float f1)f1)

{{

char c=’d’;char c=’d’;

addadd(&i1,((&i1,(intint)c);)c);

return f1;return f1;

}}

long var2=78;long var2=78;

void void main()main()

{{

}}

extern extern double d2;double d2;

void addvoid add((intint **papa,,intint b)b)

{{

long var2=32145;long var2=32145;

for(for(int int i=0;i<10;i++)i=0;i<10;i++)

{{

double d2=i;double d2=i;

d2+=*d2+=*papa;;

}}

var2=d2;var2=d2;

}}

normes normes ANSI/ISO C++ANSI/ISO C++

main.main.cppcpp prog2.prog2.cppcpp

Page 44: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Données Données -- AccessibilitéAccessibilité

static int static int i1=30;i1=30;

double d2=3.14;double d2=3.14;

float fnfloat fn((float float f1)f1)

{{

char c=’d’;char c=’d’;

addadd(&i1,((&i1,(intint)c);)c);

return f1;return f1;

}}

long var2=78;long var2=78;

void void main()main()

{{

}}

extern extern double d2;double d2;

void addvoid add((intint **papa,,intint b)b)

{{

long var2=32145;long var2=32145;

for(for(int int i=0;i<10;i++)i=0;i<10;i++)

{{

double d2=i;double d2=i;

d2+=*d2+=*papa;;

}}

var2=d2;var2=d2;

}}

Visual C++ 6.0Visual C++ 6.0

main.main.cppcpp prog2.prog2.cppcpp

Page 45: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Accessibilité Accessibilité --Espace de nomsEspace de noms

�� En C++ on peut cloisonner les variables et les En C++ on peut cloisonner les variables et les fonctions globales à l'aide de l'espace de nom fonctions globales à l'aide de l'espace de nom ((namespacenamespace))

�� Déclarer dans un espace de noms :Déclarer dans un espace de noms :namespace namespace Espace1Espace1

{{

// déclarations de type (et de classes)// déclarations de type (et de classes)

// déclarations de variables// déclarations de variables

// déclarations et définitions de fonctions// déclarations et définitions de fonctions

}}

�� Y faire référence :Y faire référence :Espace1::variable Espace1::variable usingusing namespacenamespace Espace1Espace1

Espace1::fonction() variableEspace1::fonction() variable

Page 46: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Espace de noms Espace de noms -- ExempleExemplenamespacenamespace AnglaisAnglais{{

char *char *colorcolor[]={"White","[]={"White","YellowYellow","","RedRed","","BlueBlue"};"};voidvoid Couleurs(Couleurs(int idxint idx)){{printfprintf("("Color numberColor number %d%d isis %s%s\\n",n",colorcolor[i]);[i]);

}}}}namespacenamespace FrancaisFrancais{{

char *char *colorcolor[]={"Blanc","Jaune","Rouge","Bleu"};[]={"Blanc","Jaune","Rouge","Bleu"};voidvoid Couleurs(Couleurs(int idxint idx)){{printfprintf("Couleur ("Couleur numeronumero %d est %s%d est %s\\n",n",colorcolor[i]);[i]);

}}}}

Page 47: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Espace de noms imbriquéesEspace de noms imbriquéesnamespace EspaceCouleursnamespace EspaceCouleurs{{

namespacenamespace AnglaisAnglais{{// ...// ...

}}namespace Francaisnamespace Francais{{// ...// ...

}}}}

voidvoid main()main(){{

EspaceCouleursEspaceCouleurs::::FrancaisFrancais::Couleurs(2);::Couleurs(2);}}

Page 48: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Fonctions C++Fonctions C++

�� Chaque fonction en C++ est identifiée Chaque fonction en C++ est identifiée uniquement par sa signature : nom et types uniquement par sa signature : nom et types d'arguments.d'arguments.type_type_retret Fonct1Fonct1((type1type1 p1, p1, type2type2 p2, p2, type3type3 p3);p3);

�� La signature ainsi obtenue détermine le nom La signature ainsi obtenue détermine le nom décorée de la fonction.décorée de la fonction.

�� On peut avoir des fonctions C++ avec le même On peut avoir des fonctions C++ avec le même nom mais des signatures différentesnom mais des signatures différentes

�� On peut avoir des paramètres avec des valeurs On peut avoir des paramètres avec des valeurs par défautpar défaut

Page 49: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Fonctions C++Fonctions C++SignatureSignature

�� Rechercher dansRechercher dans msvcrtmsvcrt..dlldll des fonctions C++ des fonctions C++ (avec signature) et C (sans signature)(avec signature) et C (sans signature)

�� Pour compiler comme en C il faut le demander:Pour compiler comme en C il faut le demander:

##ifdefifdef ____cpluspluscplusplusexternextern "C""C"{{##endifendif

type_type_retret Fonct1Fonct1((type1type1 p1, p1, type2type2 p2, p2, type3type3 p3);p3);

##ifdefifdef ____cpluspluscplusplus}}##endifendif

Page 50: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Fonctions C++Fonctions C++SignatureSignature

�� Créer une bibliothèque dynamique Win32 Créer une bibliothèque dynamique Win32 TestTest et et choisir l'option choisir l'option A DllA Dll thatthat exportsexports same symbolssame symbols

�� Rajouter dans l'entête la déclaration d'exportation Rajouter dans l'entête la déclaration d'exportation des trois fonctions des trois fonctions AddAdd déjà utilisées et leur déjà utilisées et leur définition puis compilez la bibliothèque DLL.définition puis compilez la bibliothèque DLL.

�� Regardez avec Regardez avec DependsDepends les fonctions exportées. les fonctions exportées. Quels sont les noms de vos fonctions Quels sont les noms de vos fonctions AddAdd ??

�� Comment faire pour garder leur nom d'origine ?Comment faire pour garder leur nom d'origine ?

Page 51: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Fonctions C++Fonctions C++Paramètres pas défautParamètres pas défaut

�� Les paramètres avec des valeurs par défaut sont Les paramètres avec des valeurs par défaut sont toujours les derniers : toujours les derniers : float Multfloat Mult((floatfloat p1, p1, floatfloat p2, p2, floatfloat p3p3=1.0f=1.0f,,

floatfloat p4p4=1.0f=1.0f););

�� Il faut déclarer Il faut déclarer une seule foisune seule fois les valeurs par défaut :les valeurs par défaut :

–– dans le prototype s'il existedans le prototype s'il existe

–– sinon dans la définitionsinon dans la définition

�� On peut appeler On peut appeler MultMult avec 2, 3 ou 4 paramètres, le avec 2, 3 ou 4 paramètres, le compilateur rajoute ceux qui manquent.compilateur rajoute ceux qui manquent.

��Ecrire la fonction, faites afficher les paramètres et Ecrire la fonction, faites afficher les paramètres et testeztestez--là avec 2, 3 et 4 paramètreslà avec 2, 3 et 4 paramètres

Page 52: Techniques de conception et de programmation en Langage C++magestik.free.fr/Cours/Quatrieme.Annee/S7/GI/ifips_cpp... · 2006-09-20 · – un livre/cours C++ de Christian Casteyde

Fonctions C++Fonctions C++Protection à la modificationProtection à la modification

�� Parfois on passe par des références ou pointeurs Parfois on passe par des références ou pointeurs pour réduire le temps d'appel et la mémoire occupée pour réduire le temps d'appel et la mémoire occupée dans la pile.dans la pile.

�� Mais on ne veut pas modifier les valeurs pointées ou Mais on ne veut pas modifier les valeurs pointées ou référencées. Alors, il faut utiliser le mot référencées. Alors, il faut utiliser le mot constconst : : void AfficheTabvoid AfficheTab(double* t1,(double* t1, intint taille);taille);

void AfficheTabvoid AfficheTab((constconst double* t1,double* t1, intint taille);taille);

�� Le compilateur vérifie que la variable pointée ou Le compilateur vérifie que la variable pointée ou référencée n'est pas modifiée par le code !référencée n'est pas modifiée par le code !void Addvoid Add((floatfloat& a, & a, floatfloat& b, & b, floatfloat& & resres););

void Addvoid Add((constconst floatfloat& a,& a,constconst floatfloat& b, & b, floatfloat& & resres););

�� Idem pour les références ou les pointeurs de retourIdem pour les références ou les pointeurs de retour