Вы находитесь на странице: 1из 9

Apprendre C++ avec Qt : Leon 5 Fonctions avec paramtres et oprateurs effet

Centre Informatique pour les Lettres et les Sciences Humaines

1 - Oprateurs effet Les oprateurs "ca#cu#Affectation" Les oprateurs "suivant" et "prcdent" ! - %finition de fonctions uti#isant des paramtres 'aramtres et varia(#es #oca#es )nitia#isations Fonctions uti#isant p#usieurs paramtres $ - *a#eur par dfaut d+un paramtre %c#aration de va#eurs par dfaut -ti#isation des va#eurs par dfaut

! ! $ & & & 5 5 , ,

& - 'aramtres permettant une fonction d+accder des o(.ets /ui ne #ui appartiennent pas 0 'aramtres de t1pe "rfrence " 'aramtres de t1pe "pointeur sur " Constance des paramtres 5 - 3on4 c+est 5enti# tout a4 mais a fait d. 0 pa5es Qu+est-ce /ue .e dois vraiment en retenir 6 0 2 2 7

%ocument du 1$811892

:etrouve; #a version #a p#us rcente sur <ttp:88sites univ-provence fr8=cpp

C++ - Leon 5

Fonctions avec paramtres

!87

Les structures de contr>#e du f#u? d+e?cution /ue #a Leon & a mis notre disposition nous permettent d+envisa5er des pro5rammes p#us am(itieu? /ue ceu? /ue nous avons pu crire .us/u+ prsent 'our comp#ter encore notre arsena#4 i# nous faut maintenant faire connaissance avec /ue#/ues nouveau? oprateurs et apprendre uti#iser des paramtres

1 - Oprateurs effet
%ans #a Leon 9$4 nous avons introduit #es oprateurs correspondant au? /uatre oprations arit<mti/ues <a(itue##es : +4 -4 * et /4 ainsi /ue #+oprateur % @modu#oA Le #an5a5e C++ propose aussi des oprateurs arit<mti/ues /ui ont un effet sur un de #eurs oprandes Les oprateurs "ca#cu#Affectation" Les cin/ oprateurs arit<mti/ues /ue nous connaissons permettent de com(iner deu? oprandes pour o(tenir un rsu#tat L+va#uation d+une e?pression ainsi forme reste4 (ien entendu4 sans effet sur #es varia(#es /ui servent ventue##ement spcifier #+un ou #+autre des oprandes Lors/u+une varia(#e doit recevoir #e rsu#tat o(tenu4 i# nous faut donc uti#iser #+oprateur d+affectation en p#us de ce#ui /ui spcifie #e ca#cu# effectuer : index = index + 1; //+ produit le rsultat et = produit l'effet Lors/ue4 comme dans #+e?emp#e ci-dessus4 #a mBme varia(#e sert tout d+a(ord spcifier #+un des oprandes puis4 dans un second temps4 recuei##ir #e rsu#tat o(tenu4 #e nom de cette varia(#e fi5ure de part et d+autre de #+oprateur d+affectation %ans cette situation4 i# est possi(#e d+uti#iser un seu# oprateur4 /ui indi/ue #a fois #a nature du ca#cu# effectuer et #e fait /ue #e rsu#tat o(tenu doit Btre stocC dans #a varia(#e : index += 1; //+= produit le rsultat et l'effet

L+intrBt de cette forme d+e?pression est /u+e##e vite d+avoir dsi5ner deu? fois #a ci(#e de #+affectation L+avanta5e peut sem(#er (ien mince #ors/ue cette ci(#e est dsi5ne directement par un nom de varia(#e4 mais i# devient nettement p#us tan5i(#e #ors/u+on a affaire une e?pression p#us comp#e?e -ne instruction te##e /ue machin.fonction()- !aleur = machin.fonction()- !aleur + 1; est encore p#us dsa5ra(#e #ire /u+ crire4 car e##e ncessite un e?amen attentif pour vrifier /ue #e rsu#tat du ca#cu# est stocC dans #a ;one de mmoire /ui a t uti#ise pour dterminer #a va#eur du premier oprande de #+addition L+ide 5nra#e4 "a.outer 1 /ue#/ue part"4 est (ien p#us visi(#e si #+on crit machin.fonction()- !aleur += 1; Les cin/ oprateurs arit<mti/ues #mentaires se dou(#ent donc d+autant d+oprateurs com(inant ca#cu# et affectation4 et on peut crire des c<oses comme
1 2 3 4 5

index index index index index

+= -= *= /= %=

decala"e; %; & + '; &; (;

//#ui!aut //#ui!aut //#ui!aut //#ui!aut //#ui!aut

$ $ $ $ $

index index index index index

= = = = =

index index index index index

+ * / %

decala"e; %; (& + '); &; (;

Ces oprateurs uti#isent une notation faisant intervenir deu? caractres4 ce /ui vo/ue c#airement #+ide /u+i#s permettent #a fois de ca#cu#er #e rsu#tat et d+o(tenir un effet d+affectation )# n+en reste pas moins /ue c<acun de ces coup#es de caractres constitue un s1m(o#e uni/ue4 /ui dsi5ne #+oprateur en /uestion )# n+est pas p#us envisa5ea(#e d+crire =- #a p#ace de -= /u+i# ne serait envisa5ea(#e d+crire truner au #ieu de return #a fin d+une fonction Attention4 toutefois : si #+usa5e du mot truner n+a aucune c<ance de passer inaperu du compi#ateur @/ui ne saura /u+en faire A4 une #i5ne te##e /ue !aria)le =- %.*; ne dc#enc<era pas #e moindre avertissement4 puis/u+e##e ordonne tout simp#ement d+affecter #a va#eur -$ 5 #a varia(#e

J-L Pris - 18/11/08

C++ - Leon 5

Fonctions avec paramtres

$87

Les oprateurs "suivant" et "prcdent" L+opration consistant a.outer @ou soustraireA un au contenu d+une varia(#e est te##ement fr/uente /u+e##e fait #+o(.et d+une notation particu#ire On crira4 par e?emp#e index++; //#ui!aut $ index = index + 1; ou $ index += 1; !aleur--; //#ui!aut $ !aleur = !aleur - 1; ou $ !aleur -= 1; Les oprateurs ++ et -- peuvent Btre p#acs avant #a varia(#e sur #a/ue##e i#s oprent @on #es dit a#ors prfi?sA ou aprs ce##e-ci @on #es dit a#ors suffi?sA Les deu? instructions prcdentes pourraient donc Btre remp#aces par ++index; //#ui!aut $ index = index + 1; ou $ index += 1; --!aleur; //#ui!aut $ !aleur = !aleur - 1; ou $ !aleur -= 1; Di #+effet o(tenu est #e mBme dans #es deu? cas4 ce n+est pas #e cas de #a va#eur de #+e?pression : #ors/ue #+oprateur est suffi?4 #+e?pression a pour va#eur #e contenu /u+avait #a varia(#e avant app#ication de #+oprateur4 a#ors /ue #ors/ue #+oprateur est prfi?4 #+e?pression a pour va#eur ce##e o(tenue aprs app#ication de #+oprateur
Autrement dit4 #ors/ue #+oprateur est devant son oprande4 i# est app#i/u avant de dterminer #a va#eur de #+e?pression4 a#ors /ue #ors/u+i# n+apparaEt /u+aprs son oprande4 i# est app#i/u aprs avoir dtermin #a va#eur de #+e?pression

1 2

1 2

1 2

3ien entendu4 dans #es e?emp#es prcdents4 seu# #+effet est important4 puis/u+i# n+est fait aucun usa5e des va#eurs o(tenues #a suite de #+va#uation des e?pressions )# n+en va pas tou.ours ainsi4 et ces oprateurs sont @trop 6A souvent emp#o1s dans des e?pressions oF #a va#eur /u+i#s produisent sert d+oprande un autre oprateur Ainsi4 par e?emp#e4 aprs int a = &; int ) = a++; //#ui!aut $ int ) = a ; a = a + 1; donc ) contient & #a varia(#e ) contient &4 puis/ue #a va#eur de #+e?pression a++ est ce##e contenue dans a avant incrmentation Gn revanc<e4 aprs int a = &; int ) = ++a; //#ui!aut $ a = a + 1 ; int ) = a; donc ) contient % #a varia(#e ) contiendra % puis/ue #a va#eur de #+e?pression ++a est ce##e contenue dans a aprs incrmentation 3ien entendu4 dans un cas comme dans #+autre4 #a varia(#e a contient fina#ement %4 puis/ue #+effet de #+oprateur est #e mBme4 /u+i# soit prfi? ou suffi? D+i# est vrai /ue #es oprateurs ++ et -- permettent parfois une concision /ui favorise #+inte##i5i(i#it du code4 i# e?iste des circonstances oF i# convient de s+a(stenir de #es uti#iser C+est en particu#ier #e cas des e?pressions oF #a mBme varia(#e fi5ure p#usieurs reprises : comme #a norme )DO du #an5a5e C++ n+impose au? compi#ateurs aucun ordre particu#ier d+va#uation des sous-e?pressions4 app#i/uer un oprateur d+incrmentation une te##e varia(#e produit des rsu#tats imprvisi(#es
C+est dire /ue4 mBme si un compi#ateur donn de (onnes c<ances de tou.ours donner #e mBme rsu#tat @et encore4 mBme ceci n+est pas a(so#ument 5aranti A4 i# est tout fait norma# /ue des compi#ateurs diffrents produisent des pro5rammes donnant des rsu#tats diffrents

1 2

1 2

Considrons #+e?emp#e suivant : int a = &; int ) = ++a + a; //) = +, * ou autre chose L+e?pression permettant de ca#cu#er #a va#eur d+initia#isation de ) est une addition faisant intervenir deu? sous-e?pressions )# e?iste au moins deu? faons d+va#uer cette addition Doit on commence par #a 5auc<e et #+va#uation de ++a se traduit par #+incrmentation de cette varia(#e et produit #a va#eur % L+va#uation de a donnera donc ensuite %4 et #e rsu#tat de #+addition sera + Doit on commence par #a droite et #+va#uation de a donne & L+va#uation de ++a donne ensuite #a va#eur %4 et conduit incrmenter cette varia(#e4 mais ceci reste sans effet sur #+va#uation de a4 /ui a d. eu #ieu Le rsu#tat de #+addition est donc * Conc#usion : H+uti#ise; IAJA)D #es oprateurs ++ et -- dans des e?pressions oF #a varia(#e #a/ue##e i#s s+app#i/uent est uti#ise p#usieurs fois

J-L Pris - 18/11/08

C++ - Leon 5

Fonctions avec paramtres

&87

! - %finition de fonctions uti#isant des paramtres


-ne faon asse; simp#e de dcrire rapidement ce /ue sont #es paramtres d+une fonction est de dire /u+i# s+a5it de varia(#es #oca#es /ui ne sont pas dfinies dans #e (#oc de code4 mais entre #es parent<ses /ui suivent immdiatement #e nom de #a fonction 'aramtres et varia(#es #oca#es Considrons4 par e?emp#e4 une fonction dfinie de #a faon suivante :
1 2 3 4 5

!oid ma.onction(int son/arametre) 0 int sa1aria)le2ocale; //ici prennent place les instructions dcri!ant le traitement effectu 3 Le (#oc de code /ui constitue #e corps de ma.onction() dispose de deu? varia(#es de t1pe int4 respectivement nommes son/arametre et sa1aria)le2ocale Les r5#es 5nra#es d+uti#isation /ui s+app#i/uent ces deu? varia(#es sont #es mBmes : ma.onction() peut en disposer #i(rement @c+est dire /u+e##e peut en uti#iser et en c<an5er #e contenuA4 mais aucune autre fonction n+a connaissance de #+e?istence de ces varia(#es
Di une autre fonction uti#ise aussi des varia(#es portant ces noms4 i# s+a5it d+une simp#e <omon1mie4 /ui peut ventue##ement drouter un #ecteur novice4 mais ne saurait entraEner /ue#/ue cons/uence /ue ce soit du point de vue du fonctionnement du pro5ramme Gn c#air :

La faon dont une fonction (aptise ses varia(#es #oca#es et ses paramtres ne re5arde /u+e##e Di #es paramtres sont de simp#es varia(#es #oca#es4 /ue# intrBt prsentent-i#s 6 Di aucune autre fonction ne peut accder au? paramtres d+une fonction donne4 en /uoi s+a5it-i# d+un mcanisme de transmission d+information entre fonctions 6 L+intrBt des paramtres rside dans une particu#arit apparemment asse; anodine : #a faon dont ces varia(#es sont initia#ises )nitia#isations Lors/u+une varia(#e #oca#e est initia#ise4 #a va#eur uti#ise est spcifie dans #e corps mBme de #a fonction A c<a/ue e?cution de #a fonction4 c+est donc #a mBme va#eur /ui est uti#ise Jodifions4 par e?emp#e4 #a dfinition de notre fonction de #a manire suivante :
1 2 3 4 5

!oid ma.onction(int son/arametre) 0 int sa1aria)le2ocale = %+; //ici prennent place les instructions dcri!ant le traitement effectu 3 Hous sommes a(so#ument certains /ue4 c<a/ue e?cution de ma.onction()4 une varia(#e de t1pe int nomme sa1aria)le2ocale sera cre et prendra %+ comme va#eur initia#e Le cas des paramtres est tota#ement diffrent : c+est #a fonction appe#ante /ui dcide de #a va#eur avec #a/ue##e i#s vont Btre initia#iss -n e?emp#e d+appe# de ma.onction() pourrait Btre ma.onction(1&); %ans ce cas4 c+est #a va#eur 1& /ui serait uti#ise pour initia#iser #a varia(#e son/arametre4 a#ors /ue dans #e cas oF #+appe# serait ma.onction(&4); c+est (ien entendu #a va#eur &4 /ui serait uti#ise La va#eur /ui se trouve ainsi transmise ma.onction() peut ne pas Btre spcifie #ittra#ement mais Btre e##e-mBme contenue dans une varia(#e %ans #+e?emp#e suivant4 ma.onction() est appe#e 199 fois4 son paramtre se trouvant initia#is c<a/ue fois avec une va#eur p#us #eve
J-L Pris - 18/11/08

C++ - Leon 5
1 2 3

Fonctions avec paramtres

587

int i; for (i = 5 ; i 6 155 ; i = i + 1) ma.onction(i); Di #a coKncidence des noms du paramtre et de #a varia(#e ventue##ement uti#ise pour spcifier #a va#eur transmise #ors de #+appe# n+a strictement aucune importance4 i# n+en va (ien entendu pas de mBme pour ce##e de #eur t1pe )# ne serait /uand mBme pas trs raisonna(#e de transmettre une va#eur dcima#e ma.onction()4 puis/ue nous savons /ue cette va#eur est destine initia#iser une varia(#e de t1pe int Lors/ue #e contenu d+une varia(#e est pass une fonction4 c+est #e t1pe de cette varia(#e @et non simp#ement sa va#eur actue##eA /ui doit Btre compati(#e avec #e t1pe du paramtre L+e?emp#e suivant provo/uerait donc un messa5e d+avertissement de #a part du compi#ateur4 /ui ne peut 5nra#ement pas savoir si #a va#eur de un7om)re est ou non entire au moment de #+appe# de ma.onction() :

1 2

dou)le un7om)re = * ; ma.onction(un7om)re);

//pro)l8me 9

Fonctions uti#isant p#usieurs paramtres Lors/u+une fonction uti#ise p#usieurs paramtres4 #eurs descriptions sont spares par des vir5u#es :
1 2 3 4 5

!oid ma.onction(int parametre:n, char parametre;eux, dou)le parametre<rois) 0 int sa1aria)le2ocale = %+; //ici prennent place les instructions dcri!ant le traitement effectu 3 L+appe# d+une te##e fonction ncessite videmment /ue des va#eurs appropries soient transmises pour initia#iser c<acun des paramtres On peut4 par e?emp#e4 crire : ma.onction((, 's', &.1=); C+est simp#ement #+ordre des va#eurs transmises /ui assure #eur mise en correspondance avec #es paramtres de #a fonction : #a premire va#eur est attri(ue au premier paramtre de #a #iste4 #a deu?ime va#eur au deu?ime paramtre4 et ainsi de suite

$ - *a#eur par dfaut d+un paramtre


Hous avons vu /ue #+appe# d+une fonction /ui uti#ise des paramtres e?i5e norma#ement de fournir une va#eur approprie pour initia#iser c<acun de ceu?-ci Cette e?i5ence est un inconvnient4 particu#irement #ors/u+on c<erc<e rendre #es fonctions ruti#isa(#es @comme dans #e cas des #i(rairies4 /ui serviront dans #e cadre de nom(reu? pro.ets diffrentsA Gn effet4 pour rendre une fonction capa(#e de traiter de nom(reu? cas particu#iers4 i# est souvent ncessaire de #a doter de nom(reu? paramtres permettant4 .ustement4 de spcifier /ue# cas particu#ier se prsente #ors d+un appe# donn Cette #on5ue #iste de paramtres prsente deu? inconvnients vidents : - Le nom(re de va#eurs fournir #ors de c<a/ue appe# au5mente4 ce /ui a#ourdit #e code et mu#tip#ie #es ris/ues d+erreurs - %ans #e cas 5nra# @/ui est souvent #e p#us fr/uentA4 #a p#upart de ces paramtres ne servent rien4 puis/ue #eur r>#e est .ustement de dcrire #es particu#arits d+un cas /ui serait e?ceptionne# Le pro5rammeur est a#ors conduit prendre en compte une mu#titude de dtai#s /ui ne #e concernent pas ce moment #4 ce /ui rend #a fonction dsa5ra(#e uti#iser Gn raction4 i# est tent de ne pas uti#iser #a fonction /ui e?iste4 mais d+en rcrire une version p#us simp#e4 ce /ui mu#tip#ie nouveau #es ris/ues d+erreurs Le #an5a5e C++ propose deu? mcanismes suscepti(#es de rpondre ce t1pe de proccupations : #a surc<ar5e et #es va#eurs par dfaut

J-L Pris - 18/11/08

C++ - Leon 5

Fonctions avec paramtres

,87

La surc<ar5e @overloading4 en an5#aisA est #a dfinition de p#usieurs fonctions a1ant #e mBme nom4 mais se distin5uant par #eurs paramtres Ce mcanisme4 /ue nous tudierons p#us en dtai# dans #a Leon 194 n+est pas spcifi/uement conu pour rduire #es #istes d+ar5uments p#t<ori/ues4 mais on peut #+uti#iser dans ce (ut Le principe des va#eurs par dfaut est trs simp#e : i# s+a5it simp#ement de prvoir4 #ors de #a conception d+une fonction4 une va#eur /ui sera uti#ise pour initia#iser un paramtre #ors/ue #a fonction appe#ante s+a(stiendra d+en fournir une Les #i(rairies ont souvent recours ces mcanismes4 dont un des aspects #es p#us sduisants est /ue #e pro5rammeur /ui uti#ise #a #i(rairie n+a pas s+en occuper : i# (nficie de #a soup#esse ainsi o(tenue4 #es pro(#mes a1ant t r5#s par ce#ui /ui a crit #es fonctions %c#aration de va#eurs par dfaut 'our attri(uer une va#eur par dfaut un paramtre4 i# suffit4 dans #a dc#aration de #a fonction4 d+indi/uer cette va#eur #a suite d+un si5ne "=" p#ac aprs #e nom du paramtre //cette li"ne fi"ure normalement dans un fichier .h !oid ma.onction(int son/arametre = >); //;?@2ABA<CD7 de la fonction La dfinition de #a fonction4 en revanc<e ne mentionne norma#ement pas de va#eur par dfaut
1 2 3 4

//ces li"nes fi"urent normalement dans un fichier .cpp !oid ma.onction(int son/arametre) //;?.C7C<CD7 de la fonction 0 //... dfinitions de !aria)les locales, instructions 3 Lors/u+une fonction comporte p#usieurs ar5uments4 i#s peuvent Btre p#usieurs avoir des va#eurs par dfaut )# e?iste toutefois une restriction : ds #ors /ue #+un des paramtres possde une va#eur par dfaut4 tous #es paramtres suivants doivent en avoir une 5a#ement //cette li"ne fi"ure normalement dans un fichier .h !oid ma.onction(dou)le p1, int p& = >, char p% = 'x'); La dc#aration suivante4 en revanc<e n+est pas admissi(#e4 car #e premier paramtre a une va#eur par dfaut a#ors /ue #e deu?ime n+en a pas : //cette li"ne fi"ure normalement dans un fichier .h !oid ma.onction(dou)le p1 = 5.&, int p&, char p% = 'x'); //?BB?:B 9 -ti#isation des va#eurs par dfaut Lors/u+une fonction comporte des va#eurs par dfaut4 on #es uti#ise simp#ement en faisant comme si #e paramtre concern n+e?istait pas Di une c#asse a t dfinie ainsi :

1 2 3 4 5

class @Ea@lasse //extrait du fichier ma@lasse.h 0 pu)licF !oid ma.onction(int son/arametre = >); 3; et /u+i# en e?iste une instance dfinie ainsi : @Ea@lasse uneCnstance;eEa@lasse; #a fonction mem(re peut Btre appe#e comme ceci : uneCnstance;eEa@lasse.ma.onction(); //son param8tre sera initialis $ >

aussi (ien /ue comme ce#a : uneCnstance;eEa@lasse.ma.onction(=); //son param8tre sera initialis $ = )# e?iste toutefois une restriction #+usa5e des va#eurs par dfaut : si #+un des paramtres a t priv de va#eur #ors d+un appe#4 tous #es paramtres suivants doivent #+Btre 5a#ement

J-L Pris - 18/11/08

C++ - Leon 5

Fonctions avec paramtres

087

Gn c#air : i# n+est pas possi(#e de "sauter" un paramtre @pour adopter sa va#eur par dfautA et de reprendre ensuite #+numration des va#eurs devant Btre adoptes par #es suivants Ceci e?p#i/ue pour/uoi fournir une va#eur par dfaut pour un paramtre imp#i/ue d+en fournir aussi pour tous #es suivants Gn effet4 #+adoption de #a va#eur par dfaut d+un paramtre prcdant un paramtre dpourvu de va#eur par dfaut rendrait impossi(#e #e passa5e d+une va#eur destine initia#iser ce second paramtre4 /ui ne disposerait donc ni d+une va#eur par dfaut ni d+une va#eur transmise #ors de #+appe# Di #a c#asse a t dfinie ainsi
1 2 3 4 5

class @Ea@lasse //extrait du fichier ma@lasse.h 0 pu)licF !oid ma.onction(char p1 = 'x', float p& = (.=); 3; ma.onction() pourra Btre appe#e comme ceci :

1 2 3

uneCnstance;eEa@lasse.ma.onction(''',1&); //p1 !audra ''' et p& !audra 1& uneCnstance;eEa@lasse.ma.onction('G'); //p1 !audra 'G' et p& !audra (.= uneCnstance;eEa@lasse.mafonction(); //p1 !audra 'x' et p& !audra (.= mais pas comme ce#a : uneCnstance;eEa@lasse.ma.onction(%.1>); //on ne peut pas accepter la !aleur par dfaut de p1 et refuser celle de p&

& - 'aramtres permettant une fonction d+accder des o(.ets /ui ne #ui appartiennent pas
Hous avons vu /ue #es paramtres4 tout comme #es varia(#es #oca#es4 sont des o(.ets /ui appartiennent e?c#usivement #a fonction dans #a/ue##e i#s sont dfinis La transmission une fonction d+une va#eur /u+e##e va uti#iser pour initia#iser un de ses paramtres permet cependant de fournir #a fonction un mo1en d+accder des o(.ets appartenant #a fonction appe#ante 'aramtres de t1pe "rfrence " Hous savons /ue #a cration d+une rfrence permet d+associer un nouveau nom #+o(.et associ Di une fonction uti#ise une rfrence comme paramtre4 #e nom de ce##e-ci devient une ti/uette dsi5nant #+o(.et avec #e/ue# a t initia#is ce paramtre Comme #+o(.et en /uestion est fourni par #a fonction appelante()4 #a rfrence devient4 pour #a fonction appelee()4 un mo1en de dsi5ner @et donc d+a5ir surA un o(.et /ui appartient #a fonction appelante()
1 2 3 4 5 1 2 3 4

!oid appelante() 0 int ma1aria)leAEoi = >; appelee(ma1aria)leAEoi); //ma1aria)leAEoi contient maintenant + 3 !oid appelee(int H o)Iet?tran"er) 0 o)Iet?tran"er += &; 3 La fonction appelee() peut4 (ien entendu4 #+Btre autant de fois /ue ncessaire et #+o(.et uti#is pour initia#iser son paramtre rfrence n+est pas forcment tou.ours #e mBme
-n paramtre tant un o(.et #oca# #a fonction4 une nouve##e rfrence est cre c<a/ue fois /ue #a fonction est e?cute Le fait /ue cette rfrence ne dsi5ne pas forcment #e mBme o(.et #ors de c<a/ue e?cution ne constitue donc pas une vio#ation du principe se#on #e/ue# une rfrence4 une fois cre4 dsi5nera tou.ours #e mBme o(.et Ce sont en fait des rfrences diffrentes @correspondant une mBme dfinition dans #e te?te source4 mais n+e?istant pas au mBme moment pendant #+e?cutionA /ui sont suscepti(#es de dsi5ner des o(.ets diffrents

J-L Pris - 18/11/08

C++ - Leon 5 'aramtres de t1pe "pointeur sur "

Fonctions avec paramtres

287

Lors/u+une fonction dispose d+un paramtre de t1pe "pointeur sur "4 #a fonction appelante() doit4 videmment4 fournir #+adresse d+un o(.et du t1pe ad/uat pour initia#iser ce paramtre Di #a fonction appelee() drfrence ce pointeur4 e##e est en mesure d+a5ir sur #+o(.et dont on #ui a pass #+adresse4 e?actement comme si e##e disposait d+une rfrence dsi5nant cet o(.et :
1 2 3 4 5 6 1 2 3 4

!oid appelante() 0 int ma1aria)leAEoi = >; appelee(H ma1aria)leAEoi); //ma1aria)leAEoi contient maintenant + 3 !oid appelee(int * mon/ointeur) 0 * mon/ointeur += &; 3 L+effet o(tenu en passant une adresse est donc /uiva#ent ce#ui produit par #+uti#isation d+une rfrence4 au? dtai#s de notation prs %ans #e cas d+un pointeur4 #a fonction appe#ante doit e?p#icitement passer une adresse4 ce /ui attire #+attention des #ecteurs sur #e fait /ue #a fonction appe#e est en mesure de modifier #+o(.et concern %ans #e cas d+une rfrence4 en revanc<e4 #e code appe#ant se prsente e?actement comme si #a fonction appe#e ne recevait /ue #a va#eur de #a varia(#e mentionne4 et cette am(i5uKt pousse certains pro5rammeurs prfrer uti#iser un pointeur #ors/ue #a fonction appe#e doit Btre en mesure de modifier un o(.et /ui ne #ui appartient pas Constance des paramtres )# arrive /ue #+on sou<aite permettre une fonction d+accder un o(.et ne #ui appartenant pas4 mais sans pour autant #+autoriser modifier cet o(.et Gn d+autres termes4 on sou<aite /ue #a fonction voit #+o(.et comme tant "read only"4 c+est dire constant 'our o(tenir cet effet4 i# suffit /ue #a fonction dispose d+un paramtre @rfrence ou pointeurA 5arantissant #a constance de #+o(.et /u+i# dsi5ne :

1 2 3 4 5 1 2 3 4 5

int inoffensi!e (const int H para) 0 //para = para + 1; //cette li"ne pro!o#uerait une erreur de compilation 9 return para + 1; 3 int inoffensi!eJis(const int * para) 0 //*para = *para + 1; //cette li"ne pro!o#uerait une erreur de compilation 9 return para + 1; 3 Di #a fonction ne doit pas modifier #+o(.et /ui ne #ui appartient pas4 pour/uoi #ui donner accs cet o(.et 6 Le comportement sou<ait peut Btre o(tenu en crivant simp#ement :

1 2 3 4

int inoffensi!e(int para) 0 return para + 1; 3 )# est vrai /ue #e passa5e d+une va#eur servant initia#iser un o(.et #oca# #a fonction permet ce##eci de disposer de #a va#eur sans pour autant Btre en mesure de modifier un o(.et /ui ne #ui appartient pas :emar/ue;4 toutefois4 /ue #e passa5e d+une va#eur e?i5e #a cration d+un o(.et #oca# et son initia#isation Certains o(.ets sont si vo#umineu? et comp#e?es /ue #eur cration est coLteuse en espace mmoire et #eur initia#isation coLteuse en temps On prfre a#ors uti#iser un paramtre de t1pe rfrence ou pointeur4 pour viter #a dup#ication de #+o(.et cause par #e passa5e d+une va#eur )# e?iste en outre des circonstances oF #+initia#isation d+un o(.et #+aide de #a va#eur d+un autre o(.et du mBme t1pe n+est pas possi(#e Le passa5e d+une adresse oF #+initia#isation d+une rfrence sont a#ors #es seu#es so#utions disponi(#es
J-L Pris - 18/11/08

C++ - Leon 5

Fonctions avec paramtres

787

5 - 3on4 c+est 5enti# tout a4 mais a fait d. 0 pa5es Qu+est-ce /ue .e dois vraiment en retenir 6
1A Les oprateurs arit<mti/ues possdent c<acun une version permettant d+o(tenir une affectation en p#us du ca#cu# /u+i#s spcifient !A Les oprateurs ++ et -- modifient d+une unit #a va#eur de #+o(.et au/ue# i#s sont app#i/us $A La va#eur d+une e?pression uti#isant ++ ou -- est diffrente se#on si #+oprateur est p#ac avant ou aprs son oprande &A Lors/u+une fonction uti#ise des paramtres4 sa dfinition en numre #es t1pes et noms entre #es parent<ses /ui s+interposent entre #e nom et #e corps de #a fonction 5A Les paramtres d+une fonction sont comme des varia(#es #oca#es /ui seraient initia#ises #+aide de va#eurs transmises par #a fonction appe#ante ,A Lors/u+une fonction uti#ise des paramtres4 on ne peut norma#ement #+appe#er /u+ condition de fournir4 dans #+ordre4 #es va#eurs d+initia#isation devant Btre uti#ises pour c<acun des paramtres 0A 'our /u+un paramtre possde une va#eur par dfaut4 ce##e-ci doit Btre mentionne dans #a dc#aration de #a fonction1 2A Lors/u+un paramtre possde une va#eur par dfaut4 on peut appe#er #a fonction en omettant de fournir une va#eur pour initia#iser ce paramtre 7A -n paramtre ne peut avoir de va#eur par dfaut /u+ condition /ue tous #es paramtres suivants en aient aussi 19A Lors/u+on omet de fournir une va#eur pour initia#iser un paramtre /ui a une va#eur par dfaut4 on ne peut p#us fournir aucune va#eur pour initia#iser #es paramtres suivants 11A Les paramtres de t1pes pointeurs ou rfrence permettent une fonction d+accder des o(.ets /ui ne #ui appartiennent pas 1!A Lors/u+une fonction accde des o(.ets /ui ne #ui appartiennent pas4 on peut #ui interdire de #es modifier en faisant des ses paramtres des pointeurs sur @ou des rfrences A des o(.ets constants

1 3ien /ue s1nta?i/uement admissi(#e4 #a prati/ue consistant fi?er #es va#eurs par dfaut des paramtres #ors de #a dfinition d+une fonction doit Btre dconsei##e au? d(utants4 car e##e est source d+erreurs diffici#es dtecter @diffrentes parties du pro5ramme peuvent se retrouver en dsaccord /uant au? va#eurs par dfaut d+un mBme paramtre d+une mBme fonctionA J-L Pris - 18/11/08

Вам также может понравиться