Chamar função dentro de uma função em C++

Jinku Hu 12 outubro 2023
  1. Mecânica de chamada de função passo a passo em C++
  2. Use a instrução return para chamar uma função dentro de uma função em C++
  3. Use std::pair para retornar dois valores da função em C++
Chamar função dentro de uma função em C++

Este artigo explicará vários métodos de como chamar uma função dentro de uma função em C++.

Mecânica de chamada de função passo a passo em C++

A chamada de uma função envolve o cálculo dos valores de seus argumentos, que são colocados no escopo local. Uma vez que existem variáveis ​​locais geralmente envolvidas em um corpo de função, é necessário haver um novo espaço de memória que é chamado de quadro de pilha. Os argumentos da função são copiados ou referenciados com nomes correspondentes e convertidos se a operação de conversão estiver envolvida. Uma vez que as etapas anteriores são concluídas, as instruções no bloco de funções são executadas até que o return seja encontrado. A instrução return força o fluxo de controle a retornar à função de chamada. Nesse ponto, o quadro de pilha alocado automaticamente é descartado e o controle continua a partir do código do chamador.

As funções têm um tipo de retorno que define o tipo de objeto que deve ser passado ao código do chamador. Podemos ter uma função que não retorna nenhum valor e é denotada com o tipo void. Caso a função tenha um tipo de retorno válido, podemos encadear as várias chamadas de função, conforme demonstrado no código de exemplo a seguir. Observe que o addTwoInts interno é executado primeiro e o valor retornado é passado para o addTwoInts externo como um de seus 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;
}

Use a instrução return para chamar uma função dentro de uma função em C++

Outro método útil para invocar uma função dentro de uma função é utilizar a instrução return. Lembre-se, porém, de que a função chamada deve ter um valor de retorno para se ajustar a esta notação ou não compilar. Além disso, a função de chamada deve ter o mesmo tipo de retorno se a única expressão após a instrução return for a função callee, conforme demonstrado no código de exemplo a seguir.

#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;
}

Use std::pair para retornar dois valores da função em C++

Existem cenários em que a função é adequada para retornar vários valores ao chamador. Em tais casos, pode-se utilizar a estrutura std::pair para armazenar cada elemento no membro de dados correspondente e passar o valor. Mais elementos podem ser passados ​​usando o ponteiro para a matriz ou qualquer contêiner STL que forneça recursos suficientes para o problema fornecido.

#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;
}
Autor: 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

Artigo relacionado - C++ Function