Passaggio per riferimento

zerbo1000
ciao ragazzi

perchè in c++ se una funzione deve restituire più di un valore devo usare il passaggio per riferimento, e il passaggio
per valore non mi da il risulato atteso?

grazie

Risposte
fabio.mandalari
Perché, per configurazione dello stesso c++, quando si sfrutta l'istruzione $return$ è possibile restituire uno ed un solo valore (avrai già sentito parlare del classico $return 0$).
Avendo questo limite, la soluzione consiste semplicemente nel non lavorare con delle variabili locali dichiarate nella funzione scritta, bensì lavorare con variabili passate alla funzione per riferimento.
In questo modo non si può dire che la funzione ritorni più valori, in quanto, come detto prima, può ritornare uno ed un solo valore, ma si vanno a modificare i valori delle variabili contenute nella funzione chiamante.
È ovvio che il passaggio per riferimento sortisce lo stesso effetto del return, ma è applicabile a più variabili.

Un esempio classico e semplice da capire è quello di calcolare il perimetro e l'area di un triangolo rettangolo sfruttando due funzioni: una, dichiarata void, che prende come parametri dal main (o da qualsiasi altra funzione chiamante) i valori immessi da tastiera dei due cateti e il valore del perimetro (per semplicità dichiarato float ed inizializzato a 0) e modifica il valore del perimetro per riferimento, l'altra dichiarata come float che prende i due lati e l'area (dichiarata float ed inizializzata a 0) e calcola l'area, restituendola poi con un semplice return.

zerbo1000
"Fabbioo":
Perché, per configurazione dello stesso c++, quando si sfrutta l'istruzione $return$ è possibile restituire uno ed un solo valore (avrai già sentito parlare del classico $return 0$).


:smt023 :smt023 :smt023 :smt023 :smt023 :smt023 :smt023

Super Squirrel
Aggiungerei che in alcuni casi la soluzione potrebbe essere l'utilizzo delle struct/classi.

claudio862
"Fabbioo":
Perché, per configurazione dello stesso c++, quando si sfrutta l'istruzione $return$ è possibile restituire uno ed un solo valore


Come nella quasi totalità dei linguaggi. La soluzione è restituire una tupla:

#include <iostream>
#include <tuple>
#include <cmath>

double compute_area(
        double const a,
        double const b,
        double const c)
{
        auto s = (a + b + c) / 2;
        return std::sqrt(s * (s - a) * (s - b) * (s - c));
}

std::tuple<double, double> compute_area_and_perimeter(
        double const a,
        double const b,
        double const c)
{
        auto area = compute_area(a, b, c);
        auto perimeter = a + b + c;
        return std::make_tuple(area, perimeter);
}

int main()
{
        auto a = 3.0;
        auto b = 4.0;
        auto c = 5.0;
        auto [area, perimeter] = compute_area_and_perimeter(a, b, c);
        std::cout
                << "area: " << area << '\n'
                << "perimeter: " << perimeter << '\n';
}

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.