MySQL Java JavaScript PHP Python HTML-CSS C-sharp C++ Go

Parametrii funcției

Prin intermediul parametrilor se pot transmite diverse valori către o funcție. Parametrii sunt enumerați după numele funcției, între paranteze, separați prin virgulă:

(typ_parametru1 nume_parametru1, typ_parametru2 nume_parametru2, ... typ_parametruN nume_parametruN)

Pentru fiecare parametru se specifică tipul și numele acestuia.

De exemplu, să definim și să apelăm o funcție care afișează în consolă numele și vârsta unei persoane:

#include <iostream>
  
void print(std::string name, unsigned age)
{
    std::cout << "Name: " << name << "\tAge: " << age << std::endl;
}
  
int main()
{
    print("Tom", 38);    // Name: Tom    Age: 38
}

La rularea programului vom obține următoarea ieșire în consolă:

Name: Tom    Age: 38

Funcția print() primește doi parametri și afișează valorile acestora. Primul parametru se numește name și este de tip std::string. Al doilea parametru se numește age și este de tip unsigned int. La apelul funcției trebuie transmise valori pentru acești parametri:

print("Tom", 38);

Valorile transmise parametrilor funcției la apelare se numesc argumente. În acest caz sunt transmise un literal de tip șir de caractere și un literal întreg. Argumentele se transmit prin poziție: primul argument ("Tom") este asociat primului parametru (name), iar al doilea (38) celui de-al doilea parametru (age).

Argumentele trebuie să corespundă ca tip parametrilor sau să permită conversia implicită către tipul parametrului. În exemplul de mai sus, literalul șirului este convertit automat în std::string.

În mod similar, se pot transmite nu doar literali, ci și valori ale variabilelor sau constante:

#include <iostream>
  
void print(std::string name, unsigned age)
{
    std::cout << "Name: " << name << "\tAge: " << age << std::endl;
}
  
int main()
{
    const std::string userName {"Bob"};
    unsigned userAge {42};
    print(userName, userAge);    // Name: Bob    Age: 42 
}

La apelul funcției, parametrul name va primi valoarea constantei userName, iar parametrul age valoarea variabilei userAge.

Când folosim un prototip al funcției, acesta trebuie să conțină tipurile parametrilor:

#include <iostream>
  
void print(std::string, unsigned);  // prototipul funcției print
  
int main()
{
    print("Sam", 28);    // Name: Sam    Age: 28
}
 
void print(std::string name, unsigned age)
{
    std::cout << "Name: " << name << "\tAge: " << age << std::endl;
}

Opțional, în prototip pot fi menționate și numele parametrilor:

void print(std::string name, unsigned age);  // prototip

Argumente implicite

O funcție poate primi argumente implicite, adică valori pe care le va folosi dacă, la apelul funcției, nu sunt transmise explicit:

#include <iostream>
 
void print(std::string name, unsigned age = 18)
{
    std::cout << "Name: " << name << "\tAge: " << age << std::endl;
}
  
int main()
{
    print("Sam");       // Name: Sam    Age: 18
    print("Tom", 22);   // Name: Tom    Age: 22
}

Pentru a seta o valoare implicită, aceasta se atribuie în declarația parametrului: unsigned age = 18. Dacă nu se transmite o valoare pentru al doilea parametru, se va folosi cea implicită. Ieșirea în consolă:

Name: Sam       Age: 18  
Name: Tom       Age: 22

Dacă funcția are un prototip, acesta poate conține și valorile implicite, iar în definiția funcției ele nu mai sunt necesare:

#include <iostream>
  
void print(std::string, unsigned = 18);  // prototip
  
int main()
{
    print("Sam");       // Name: Sam    Age: 18
    print("Tom", 23);   // Name: Tom    Age: 23
}
 
void print(std::string name, unsigned age)
{
    std::cout << "Name: " << name << "\tAge: " << age << std::endl;
}

La definirea parametrilor opționali, aceștia trebuie să urmeze după cei obligatorii. De exemplu, să setăm și pentru name o valoare implicită:

#include <iostream>
  
void print(std::string = "Undefined", unsigned = 18);  // prototip
  
int main()
{
    print();            // Name: Undefined  Age: 18
    print("Sam");       // Name: Sam    Age: 18
    print("Tom", 23);   // Name: Tom    Age: 23
}
 
void print(std::string name, unsigned age)
{
    std::cout << "Name: " << name << "\tAge: " << age << std::endl;
}

Deoarece name este acum parametru opțional, parametrul age care îl urmează trebuie și el să aibă o valoare implicită.

Deducerea automată a tipului parametrilor

Începând cu C++20, se poate folosi cuvântul cheie auto în locul unui tip concret pentru parametri. Tipul va fi dedus automat în timpul compilării, în funcție de argumentele transmise:

#include <iostream>
 
void sum(auto, auto);   // prototipul funcției sum
 
int main()
{
    const int n1{3};
    const int n2{4};
    sum(n1, n2);  // 3 + 4 = 7
 
    const double d1{3.3};
    const double d2{4.4};
    sum(d1, d2);  // 3.3 + 4.4 = 7.7
}
 
void sum(auto a, auto b)
{
    auto result = a + b;
    std::cout << a << " + " << b << " = " << result << std::endl;
}

În acest caz, funcția sum calculează suma a două valori. Deoarece putem transmite numere de tipuri diferite, folosirea cuvântului auto permite ca tipul să fie dedus automat, evitând specificarea explicită.