Chiamare una funzione all'interno di una funzione in C++

Jinku Hu 12 ottobre 2023
  1. Meccanica delle chiamate di funzione passo dopo passo in C++
  2. Usa l’istruzione return per chiamare una funzione all’interno di una funzione in C++
  3. Usa std::pair per restituire due valori dalla funzione in C++
Chiamare una funzione all'interno di una funzione in C++

Questo articolo spiegherà diversi metodi su come chiamare una funzione all’interno di una funzione in C++.

Meccanica delle chiamate di funzione passo dopo passo in C++

La chiamata di una funzione implica il calcolo dei valori per i suoi argomenti, che vengono inseriti nell’ambito locale. Poiché ci sono variabili locali solitamente coinvolte nel corpo di una funzione, ci deve essere un nuovo spazio di memoria chiamato stack frame. Gli argomenti della funzione vengono copiati o referenziati con i nomi corrispondenti e convertiti se è coinvolta l’operazione di cast. Una volta completati i passaggi precedenti, le istruzioni nel blocco funzione vengono eseguite finché non si incontra il return. L’istruzione return forza la restituzione del flusso di controllo alla funzione chiamante. A questo punto, lo stack frame allocato automaticamente viene scartato e il controllo continua dal codice chiamante.

Le funzioni hanno un tipo di ritorno che definisce il tipo di oggetto che dovrebbe essere passato al codice del chiamante. Possiamo avere una funzione che non restituisce alcun valore ed è indicata con il tipo void. Nel caso in cui la funzione abbia un tipo restituito valido, possiamo concatenare più chiamate di funzione come dimostrato nel seguente codice di esempio. Notare che l ‘addTwoInts interno viene eseguito per primo e il valore restituito viene passato al addTwoInts esterno come uno dei suoi argomenti.

#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::string;

int addTwoInts(int i, int j) { return i + j; }

int main() {
  cout << "2 + 1 + -3  = " << addTwoInts(addTwoInts(2, 1), -3) << endl;
  cout << "(10 + 10) + (11 + -11) = "
       << addTwoInts(addTwoInts(10, 10), addTwoInts(11, -11)) << endl;
  cout << "(12 + -9) + 10) + -11) = "
       << addTwoInts(addTwoInts(addTwoInts(12, -9), 10), -11) << endl;

  return EXIT_SUCCESS;
}

Usa l’istruzione return per chiamare una funzione all’interno di una funzione in C++

Un altro metodo utile per invocare una funzione all’interno di una funzione è utilizzare l’istruzione return. Tuttavia, la funzione chiamata dovrebbe avere un valore di ritorno per adattarsi a questa notazione o non compilare. Inoltre, la funzione chiamante dovrebbe avere lo stesso tipo di ritorno se l’unica espressione dopo l’istruzione return è la funzione chiamata, come mostrato nel seguente codice di esempio.

#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::string;

int addTwoInts(int i, int j) { return i + j; }

int multiplyAccumulate(int i, int j) { return addTwoInts(i, i * j); }

int main() {
  cout << "multiplyAccumulate(1,2) = " << multiplyAccumulate(2, 2) << endl;

  return EXIT_SUCCESS;
}

Usa std::pair per restituire due valori dalla funzione in C++

Esistono scenari in cui la funzione è adatta a restituire diversi valori al chiamante. In questi casi, si può utilizzare la struttura std::pair per memorizzare ogni elemento nel membro dati corrispondente e passare il valore. È possibile passare più elementi utilizzando il puntatore all’array o qualsiasi contenitore STL che fornisce funzionalità sufficienti per il problema dato.

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

std::pair<int, int> findMaxMin(vector<int> &arr) {
  std::pair<int, int> ret;

  auto max = std::max_element(arr.begin(), arr.end());
  auto min = std::min_element(arr.begin(), arr.end());

  ret.first = arr.at(std::distance(arr.begin(), max));
  ret.second = arr.at(std::distance(arr.begin(), min));
  return ret;
}

int main() {
  vector<int> array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

  auto ret = findMaxMin(array);
  cout << "Maximum element is " << ret.first << ", Minimum is " << ret.second
       << endl;

  return EXIT_SUCCESS;
}
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Articolo correlato - C++ Function