
please wait
tip nume ( parametru1, parametru2, ...) { instructiuni }
tip
este tipul valorii returnate de funcție.nume
este identificatorul cu care funcția poate fi apelată.parameteri
(în număr necesar): fiecare parametru constă într-un tip urmat de un identificator și fiind separat de următorul prin virgulă. Fiecare parametru seamănă foarte mult cu o declarație obișnuită de variabilă (de exemplu: int x
) și, de fapt, acționează în interiorul funcției ca o variabilă obișnuită care este locală (în funcție). Scopul parametrilor este de a permite transmiterea de argumente către funcție din locația de unde este apelată.instructiuni
formează corpul funcției. Este un bloc de instrucțiuni cuprinse între acolade { } care precizează ceea ce să facă funcția.
|
|
Rezultatul este 8 |
adunare
și main
. Să ne amintim că indiferent de ordinea în care au fost definite, un program C++ începe întotdeauna prin apelarea lui main
. De fapt, main
este singura funcție apelată automat, iar codul din oricare altă funcție este executat numai dacă funcția respectivă este apelată din main
(direct sau indirect - dintr-o altă funcție apelată, la rândul său).main
începe cu declararea variabilei z
de tip int
, iar imediat după aceasta execută primul apel de funcție: apelează funcția adunare
. Apelul unei funcții are o structură asemănătoare cu declarația. În exemplul de mai sus, apelul funcției adunare
poate fi comparat cu definiția acesteia care se găsește cu câteva linii mai sus:5
și 3
; acestea corespund parametrilor a
și b
, declarați pentru funcția adunare
.adunare
: aici se oprește execuția lui main
și va fi reluată la terminarea funcției adunare
. În momentul apelului funcției, valorile ambelor argumente (5
și 3
) sunt copiate în variabilele locale int a
și int b
din interiorul funcției.adunare
, se declară o altă variabilă locală (int r
) și, cu ajutorul expresiei r=a+b
, rezultatul lui a
plus b
este atribuit lui r
; care, în acest caz, unde a
este 5 și b
este 3, r
va avea valoarea 8.
|
|
adunare
și redă controlul punctului în care funcția a fost apelată; în acest caz, funcției main
. Exact în acest moment, programul își reia cursul în main
revenind exact în același punct în care a fost întrerupt de apelul funcției adunare
. În plus, deoarece funcția adunare
are un tip returnat, apelul este evaluat ca având o valoare și această valoare este cea precizată în instrucțiunea return de la sfârșitul funcției adunare
: în acest caz particular, valoarea variabilei locale r
, care are valoarea 8 la punctul return
.adunare
este o expresie având valoarea returnată de funcție și, în acest caz, valoarea 8 este atribuită lui z
. Este ca și cum întregul apel al funcției (adunare(5,3)
) ar fi înlocuit cu valoarea pe care aceasta o returnează (adică 8).
|
|
|
|
Primul rezultat este 5 Al doilea rezultat este 5 Al treilea rezultat este 2 Al patrulea rezultat este 6 |
adunare
din exemplul anterior, acest exemplu definește funcția scadere
, care returneaza diferența dintre cei doi parametri ai săi. De această dată, main
apelează funcția de câteva ori, arătând mai multe variante în care poate fi apelată o funcție.
|
|
|
|
|
|
|
|
scadere (7,2)
.
|
|
x
și y
pe care le au la momentul apelului: 5, respectiv 3, returnând 2 ca rezultat.
|
|
|
|
|
|
tip nume ( argument1, argument2 ...) { instructiuni }
void
, care este un tip special ce reprezintă absența unei valori. De exemplu, o funcție care doar afișează un mesaj nu are nevoie să returneze o valoare:
|
|
Eu sunt o functie! |
void
poate fi folosi, de asemenea, ca listă de parametri ai funcției pentru a preciza explicit că, de fapt, funcția nu are nevoie de niciun parametru. De exemplu, am fi putut defini afiseaza_mesaj
și astfel:
|
|
void
, dar folosirea lui void
în locul listei de argumente a fost popularizată de limbajul C, în care este obligatorie.afiseaza_mesaj
în exemplul anterior:
|
|
|
|
main
este int
, dar în cele mai multe exemple dinainte nu s-a returnat, practic, nici o valoare din main
.main
se termină normal, fără a întâlni vreo instrucțiune return
, compilatorul presupune că funcția se termină cu o instrucțiune return implicită:
|
|
main
, din motive istorice. Toate celelalte funcții cu tip returnat trebuie să se termine cu o instrucțiune return
potrivită, care să includă o valoare, chiar și dacă valoarea respectivă nu este folosită deloc.main
returnează zero (fie implicit sau explicit), mediul intrepretează că programul s-a terminat corect. main
poate returna și alte valori, iar unele medii permit accesul la acele valori, deși nu este nici necesar, nici portabil acest comportament între platforme. Valorile pentru main
care, garantat, sunt interpretate în același fel pe toate platformele sunt:Valoare | Descriere |
---|---|
0 | Programul s-a terminat corect. |
EXIT_SUCCESS | Programul s-a terminat corect (la fel ca mai sus). Această valoare este definită în header-ul <cstdlib> . |
EXIT_FAILURE | Programul a eșuat. Această valoare este definită în header-ul <cstdlib> . |
return 0;
implicită pentru main
este o excepție delicată, unii autori consideră o bună practică să scrie explicit această instrucțiune.
|
|
x
, respectiv y
. Aceste valori (5 și 3) sunt folosite pentru a inițializa variabilele date ca parametri în definiția funcției, însă orice modificare a acelor variabile în interiorul funcției nu are efect asupra variabilelor x și y din afara ei, deoarece în apel nu au fost transmise chiar x și y, ci numai valorile lor în acel moment.duplicat
în această secvență de cod duplică valorile celor trei argumente ale sale, făcând ca variabilele folosite drept argumente să fie modificate chiar de apel:
|
|
x=2, y=6, z=14 |
&
) imediat după tipul parametrilor, ca la parametrii lui duplicat
în exemplul de mai sus.a
, b
și c
devin alias-uri ale argumentelor transmise în apelul funcției (x
, y
și z
) și orice schimbare asupra lui a
în interiorul funcției devine schimbare a variabilei x
în afara funcției. Orice schimbare a lui b
modifică pe y
și orice schimbare asupra lui c
îl modifică pe z
. Aceasta înseamnă că atunci când, în exemplul de mai sus, funcția duplicat
modifică valorile variabilelor a
, b
și c
, vor fi afectate și valorile lui x
, y
și z
.
|
|
|
|
x
, y
și z
ar fi avut valorile nemodificate (adică 1, 3, respectiv 7).int
, dar dacă parametrul are un tip compus larg (care necesită mult spațiu), poate rezulta o oarecare supraîncărcare. De exemplu, să considerăm funcția următoare:
|
|
a
și b
să fie copii ale argumentelor transmise funcției la apel. Și, dacă acestea sunt șiruri lungi, poate însemna copierea unei mari cantități de date doar pentru apelul funcției.
|
|
concateneaza
warw mai eficientă decât versiunea cu parametri prin valoare, deoarece nu este necesară copierea costisitoare a unor string-uri.
|
|
const
, funcției i se interzice să modifice atât valoarea lui a
, cât și pe cea a lui b
, dar poate accesa valorile lor ca referințe (aliasurile argumentelor), fără a trebui să realizeze copii ale string-urilor.const
asigură funcționarea asemănătoare transmiterii argumentelor prin valoare, dar cu o eficiență crescută pentru parametrii costisitori. Acesta este motivul pentru care sunt foarte folosite în C++ în cazul tipurilor costisitoare. Reținem, totuși, că pentru tipurile fundamentale de date nu are importanță deosebită din punct de vedere al eficienței, ba chiar, în unele cazuri, pot fi chiar mai puțin eficiente!inline
informăm compilatorul că, în locul mecanismului uzual de apelare a unei funcții, se preferă expandarea inline pentru o anumită funcție. Acest fapt nu va schimba comportamentul unei funcții; pur și simplu se sugerează compilatorului că secvența de cod generată de corpul funcției ar trebui inserată în fiecare punct în care se apelează, renunțându-se la un apel obișnuit.
|
|
concateneaza
, programul să expandeze funcția inline, în loc de executarea unui apel obișnuit. inline
se precizează numai la definiția funcției, nu și când este apelată.inline
. De aceea, specificatorul pur și simplu precizează compilatorului că se preferă forma inline a acelei funcții, deși compilatorul poate să nu o trateze așa și să optimizeze codul altfel. În C++, optimizarea este o sarcină a compilatorului, care poate să genereze orice fel de cod, atât timp cât comportamentul rezultat este cel specificat de cod.
|
|
6 5 |
imparte
. În primul:
|
|
int b=2
). De aceea, rezultatul este 6.
|
|
b
(int b=2
) și b
ia valoarea transmisă ca argument, adică 4, rezultând valoarea 5.x
nu poate fi folosită înainte să apară într-o instrucțiune de declarație, cum ar fi:
|
|
main
, care este funcția din care erau apelate alte funcții. Dacă main
ar fi fost definită înaintea celorlalte, s-ar fi încălcat regula ca funcția să fie declarată înainte de a fi folosită și, deci, programele nu ar fi compilat.protofunctie
cu doi parametri poate fi declarat cu oricare dintre instrucțiunile:
|
|
|
|
Va rugam, tastati un numar (0 pentru iesire): 9 Este impar. Va rugam, tastati un numar (0 pentru iesire): 6 Este par. Va rugam, tastati un numar (0 pentru iesire): 1030 Este par. Va rugam, tastati un numar (0 pentru iesire): 0 Este par. |
|
|
void
în acest caz). Declarând aceste prototipuri, funcțiile pot fi apelate înainte de a fi definite complet (adică din funcția main
).impar
și par
se apelează reciproc; avem un apel la par
în interiorul lui impar
și un apel al lui impar
în par
. Și, de aceea, nu am putea găsi o metodă de structurare a codului astfel încât impar
să fie definit înainte de par
și par
înainte de impar
.n!
), formula matematică este:n! = n * (n-1) * (n-2) * (n-3) ... * 1
5!
(factorial de 5) ar fi:5! = 5 * 4 * 3 * 2 * 1 = 120
|
|
9! = 362880 |
![]() Structuri de control | ![]() Index | ![]() Supraîncărcare și șabloane |