Llamar a una función dentro de una función en C++
- Mecánica de llamadas a funciones paso a paso en C++
-
Utilice la instrucción
return
para llamar a una función dentro de una función en C++ -
Utilice
std::pair
para devolver dos valores de la función en C++
Este artículo explicará varios métodos de cómo llamar a una función dentro de una función en C++.
Mecánica de llamadas a funciones paso a paso en C++
La llamada de una función implica calcular los valores de sus argumentos, que se colocan en el ámbito local. Dado que hay variables locales generalmente involucradas en el cuerpo de una función, es necesario que haya un nuevo espacio de memoria que se llama marco de pila. Los argumentos de la función se copian o referencian con los nombres correspondientes y se convierten si la operación de conversión está involucrada. Una vez que se realizan los pasos anteriores, las declaraciones en el bloque de funciones se ejecutan hasta que se encuentra el return
. La declaración return
obliga al flujo de control a regresar a la función que llama. En este punto, el marco de pila asignado automáticamente se descarta y el control continúa desde el código de la persona que llama.
Las funciones tienen un tipo de retorno que define el tipo de objeto que debe pasarse al código de la persona que llama. Podemos tener una función que no devuelve ningún valor y se denota con el tipo void
. En caso de que la función tenga un tipo de retorno válido, podemos encadenar las múltiples llamadas a funciones como se demuestra en el siguiente código de ejemplo. Tenga en cuenta que el addTwoInts
interno se ejecuta primero y el valor devuelto se pasa al addTwoInts
externo como uno de sus argumentos.
#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;
}
Utilice la instrucción return
para llamar a una función dentro de una función en C++
Otro método útil para invocar una función dentro de una función es utilizar la declaración return
. Sin embargo, tenga en cuenta que la función llamada debe tener un valor de retorno para ajustarse a esta notación o no compilarse. Además, la función de llamada debe tener el mismo tipo de retorno si la única expresión después de la declaración return
es la función de llamada, como se demuestra en el siguiente código de ejemplo.
#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;
}
Utilice std::pair
para devolver dos valores de la función en C++
Hay escenarios en los que la función es adecuada para devolver varios valores a la persona que llama. En tales casos, se puede utilizar la estructura std::pair
para almacenar cada elemento en el miembro de datos correspondiente y pasar el valor. Se pueden pasar más elementos usando el puntero a el array o cualquier contenedor STL que proporcione características suficientes para el problema dado.
#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