C++ で関数内で関数を呼び出す

胡金庫 2023年10月12日
  1. C++ での関数呼び出しの仕組み
  2. C++ で return 文を使って関数の中の関数を呼び出す
  3. C++ で関数から 2つの値を返すには std::pair を使う
C++ で関数内で関数を呼び出す

この記事では、C++ の関数内で関数を呼び出す方法のいくつかの方法について説明します。

C++ での関数呼び出しの仕組み

関数の呼び出しには、ローカルスコープに配置される引数の値の計算が伴います。通常、関数本体にはローカル変数が含まれるため、スタックフレームと呼ばれる新しいメモリスペースが必要です。関数の引数は、対応する名前でコピーまたは参照され、キャスト操作が含まれる場合は変換されます。前の手順が完了すると、関数ブロック内のステートメントは、return が検出されるまで実行されます。return ステートメントは、制御フローを呼び出し元の関数に強制的に戻します。この時点で、自動的に割り当てられたスタックフレームは破棄され、呼び出し元のコードから制御が続行されます。

関数には、呼び出し元コードに渡されるオブジェクトのタイプを定義する戻り型があります。値を返さず、void タイプで示される関数を使用できます。関数が有効な戻り型を持っている場合、次のサンプルコードに示すように、複数の関数呼び出しをチェーンできます。内側の addTwoInts が最初に実行され、戻り値が引数の 1つとして外側の addTwoInts に渡されることに注意してください。

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

C++ で return 文を使って関数の中の関数を呼び出す

関数内で関数を呼び出すもう 1つの便利な方法は、return ステートメントを利用することです。ただし、呼び出された関数には、この表記に適合するか、コンパイルされない戻り値が必要です。さらに、次のサンプルコードに示すように、return ステートメントの後の唯一の式が呼び出し先関数である場合、呼び出し元の関数は同じ戻り型を持つ必要があります。

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

C++ で関数から 2つの値を返すには std::pair を使う

関数が呼び出し元に複数の値を返すのに適しているシナリオがあります。このような場合、std::pair 構造を利用して、各要素を対応するデータメンバーに格納し、値を渡すことができます。配列または特定の問題に十分な機能を提供する任意の STL コンテナーへのポインターを使用して、より多くの要素を渡すことができます。

#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;
}
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Function