De ce contează?
O rețetă de prăjitură are un nume („tort de ciocolată") și o listă de pași concreți: amestecă, coace, decorează. Declararea e numele de pe copertă; definirea e rețeta propriu-zisă, pas cu pas, care chiar produce tortul.
Ce este definirea unei funcții?
Definirea conține codul efectiv al funcției — corpul dintre acolade. Spre deosebire de declarare (care se termină cu ;), definirea descrie ce face funcția.
Forma generală:
tip_returnat nume_functie(parametri) {
// corpul: instructiunile functiei
return valoare; // daca tipul nu e void
}Dacă definești funcția înainte de main, nu mai ai nevoie de un prototip separat — definirea servește și ca declarare. Prototipul e necesar doar când definirea vine după primul apel.
Instrucțiunea return
return face două lucruri deodată: trimite o valoare înapoi la locul apelului și oprește funcția pe loc. Orice cod scris după un return executat nu mai rulează.
int maxim(int a, int b) {
if (a > b) return a; // daca a e mai mare, ies aici
return b; // altfel ajung aici
}Tipul valorii din return trebuie să fie compatibil cu tipul returnat declarat. O funcție int întoarce un întreg, una double întoarce un real.
Funcții fără valoare returnată: void
Unele funcții fac o acțiune, dar nu calculează un rezultat — de exemplu afișează ceva. Pentru ele folosim tipul void:
#include <iostream>
using namespace std;
void salut(string nume) {
cout << "Salut, " << nume << "!\n";
// fara return cu valoare
}
int main() {
salut("Ana"); // Salut, Ana!
salut("Bogdan"); // Salut, Bogdan!
return 0;
}Într-o funcție void poți folosi return; simplu (fără valoare) ca să ieși mai devreme, dar nu e obligatoriu la final.
Exemplu complet
#include <iostream>
using namespace std;
int maxim(int a, int b) {
if (a > b) return a;
return b;
}
int main() {
int x = 7, y = 12;
cout << maxim(x, y) << endl; // 12
cout << maxim(20, 5) << endl; // 20
return 0;
}Funcția maxim e definită o singură dată, dar o putem apela de câte ori vrem, cu argumente diferite. Asta e câștigul: scrii logica o dată, o refolosești oriunde.
Complexitate
Definirea în sine nu are cost — costul vine din ce face corpul. O funcție cu o singură comparație, ca maxim:
| Caz | Timp | Spațiu |
|---|---|---|
| oricare | O(1) | O(1) |
Capcane la definire:
- Funcție
intfărăreturnpe toate ramurile: dacă unifîntoarce o valoare dar ramuraelsenu, comportamentul e nedefinit. Asigură unreturnpe orice drum. - Confuzi
returncucout:returntrimite valoarea înapoi în program;couto afișează pe ecran. Sunt lucruri diferite. - Cod după
return: instrucțiunile de după unreturnexecutat sunt cod mort — nu rulează niciodată. - Definești aceeași funcție de două ori: două definiri cu același antet dau eroare de „redefinire". Declararea poate apărea de mai multe ori, definirea o singură dată.
Recapitulare
- Definirea conține corpul funcției între acolade și descrie ce face efectiv.
returntrimite o valoare înapoi și oprește imediat funcția.voidmarchează o funcție care face o acțiune fără să întoarcă o valoare.