Funcții

Funcțiile sunt o colecție de tipuri de date, variabile și instrucțiuni, care îndeplinesc o anumită sarcină, atunci când sunt apelate. Acestea sunt folosite, deoarece ne oferă câteva avantaje, precum:

  • reutilizarea codului - putem apela funcția de oricâte ori este nevoie
  • modularizare - putem împărții o problemă în mai multe probleme, dar mai simple
  • reducerea și depistarea erorilor

Anatomia funcțiilor

Funțiile au nevoie să fie declarate înainte de a putea fi folosite, ca orice alt lucru în C++. Acestea sunt formate din mai multe componente, precum:

Antetul funcției

int Sum(int a, int b)
  • funcția returnează o valoare de tip int
  • funcția se numește Sum
  • funcția ia ca parametrii 2 valori, a și b de tip int

Funcțiile pot returna mai multe tipuri de date, precum int, float, char, etc. și un tip special, numit void, care spune că funcția nu va returna nimic. Tipul de date returnat este specificat chiar la începutul funției, ca în exemplul dat.

Corpul funcției

{
    int val = a + b;
    return val;
}
  • funția are 2 instrucțiuni, una care face suma parametrilor a și b și alta care returnează valoarea lui val

Este necesar ca funcțiile care au un tip de date diferit de void să conțină instrucțiunea return, care să returneze tipul de date specificat în antet

Apelul funcției

Sum(10, 2);
  • apelul se realizează în funția main sau orice altă funcție
  • se vor transmite funcției apelate valorile necesare pentru parametrii ceruți de aceasta

Este necesar ca ordinea parametrilor să fie respectată, iar apelul să se realizeze corespunzător.


#include <iostream>
using namespace std;

int Sum(int a, int b) {
    int val = a + b;

    return val;
}

int main() {
    cout << Sum(10, 2);

    return 0;
}

Programul va afișa pe ecran valoarea 12.

Returnarea valorilor

Așa cum am discutat mai sus, funțiile sunt folositoare mai ales deoarece pot să returneze valori. Tipul de date returnat este scris primul, înaintea funcției și poate fi void, int, double, etc. Cu toate acestea, funcția poate returna valori și prin parametrii, folosind o referință. În acest caz, tipul de date returnat este void, iar la final nu vom mai avea instrucțiunea return.

Exemplu

#include <iostream>
using namespace std;

void Sum(int a, int b, int& val) {
    val = a + b;
}

int main() {
    int sum;

    Sum(10, 2, sum);
    cout << sum;

    return 0;
}

În exemplul dat, funcția ia ca parametrii 2 valori de tip int și o valoare de tip int&, unde & ne spune că acel parametru este de fapt o referință. Acest lucru înseamnă că dacă îl vom modifica în funcție, acesta va fi modificat și în afara ei, acolo unde a fost declarat. Așadar, programul nostru face suma a 2 numere, însă aceasta este trimisă, prin referință, variabilei sum, declarată în main.

Exemplu

#include <iostream>
using namespace std;

void MaxVal(int v[], int n, int& maxVal) {
    maxVal = -1;

    for (int i = 0; i < 5; i++) {
        if (v[i] > maxVal) {
            maxVal = v[i];
        }
    }
}

int main() {
    int v[5] = {0, 4, 100, 99, 3};
    int maxVal;

    MaxVal(v, 5, maxVal);
    cout << maxVal;

    return 0;
}

În acest exemplu, funcția va returna, prin referință, valoarea maximă din vectorul v.

Exemplu

#include <iostream>
using namespace std;

int MaxVal(int v[], int n) {
    int maxVal = -1;

    for (int i = 0; i < 5; i++) {
        if (v[i] > maxVal) {
            maxVal = v[i];
        }
    }

    return maxVal;
}

int main() {
    int v[5] = {0, 4, 100, 99, 3};

    cout << MaxVal(v, 5);

    return 0;
}

În acest exemplu, funcția va returna valoarea maximă din vectorul v.