Appeler une fonction dans une fonction en C++
- Mécanique des appels de fonction étape par étape en C++
-
Utilisez l’instruction
return
pour appeler une fonction dans une fonction en C++ -
Utilisez
std::pair
pour renvoyer deux valeurs de la fonction en C++
Cet article explique plusieurs méthodes pour appeler une fonction dans une fonction en C++.
Mécanique des appels de fonction étape par étape en C++
L’appel d’une fonction implique le calcul des valeurs de ses arguments, qui sont placés dans la portée locale. Puisqu’il y a des variables locales généralement impliquées dans un corps de fonction, il doit y avoir un nouvel espace mémoire appelé un frame de pile. Les arguments de fonction sont copiés ou référencés avec les noms correspondants et convertis si l’opération de conversion est impliquée. Une fois les étapes précédentes effectuées, les instructions du bloc fonction sont exécutées jusqu’à ce que le return
soit rencontré. L’instruction return
force le retour du flux de contrôle à la fonction appelante. À ce stade, la trame de pile allouée automatiquement est supprimée et le contrôle se poursuit à partir du code de l’appelant.
Les fonctions ont un type de retour qui définit le type d’objet qui doit être passé au code de l’appelant. On peut avoir une fonction qui ne retourne aucune valeur et qui est notée avec le type void
. Dans le cas où la fonction a un type de retour valide, nous pouvons enchaîner les multiples appels de fonction comme illustré dans l’exemple de code suivant. Notez que le addTwoInts
interne est exécuté en premier, et que la valeur retournée est passée au addTwoInts
externe comme l’un de ses arguments.
#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;
}
Utilisez l’instruction return
pour appeler une fonction dans une fonction en C++
Une autre méthode utile pour invoquer une fonction dans une fonction est d’utiliser l’instruction return
. Attention cependant, la fonction appelée doit avoir une valeur de retour pour s’adapter à cette notation ou ne pas compiler. De plus, la fonction appelante doit avoir le même type de retour si la seule expression après l’instruction return
est la fonction appelée, comme illustré dans l’exemple de code suivant.
#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;
}
Utilisez std::pair
pour renvoyer deux valeurs de la fonction en C++
Il existe des scénarios où la fonction est adaptée pour renvoyer plusieurs valeurs à l’appelant. Dans de tels cas, on peut utiliser la structure std::pair
pour stocker chaque élément dans le membre de données correspondant et passer la valeur. D’autres éléments peuvent être passés à l’aide du pointeur vers le tableau ou de tout conteneur STL qui fournit des fonctionnalités suffisantes pour le problème donné.
#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;
}
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