C++における関数の呼び出しと複数の値の返却方法について、完全かつ包括的な解説を行います。関数を使って複数の値を返す方法にはいくつかの方法があり、それぞれの方法には特定の使い道や利点があります。この記事では、C++における関数呼び出しの基本的な概念から、複数の値を返すためのテクニックまで、詳しく説明します。
1. 関数の基本的な構造
まず、C++で関数を定義する基本的な方法について確認しましょう。関数は、特定の処理をまとめて再利用できるコードのブロックです。関数の定義には、戻り値の型、関数名、引数のリスト、関数の本体が含まれます。

cpp#include
using namespace std;
// 引数を1つ受け取って、その値を2倍にして返す関数
int doubleValue(int x) {
return x * 2;
}
int main() {
int result = doubleValue(5);
cout << "結果: " << result << endl; // 結果: 10
return 0;
}
この基本的な関数は、引数x
を受け取って、その2倍の値を返します。しかし、1つの値だけではなく、複数の値を関数から返す方法についても見ていきましょう。
2. 複数の値を返す方法
C++では、関数から複数の値を返す方法として、主に以下の3つの方法が使用されます:
-
参照を使って値を返す
-
構造体やクラスを使って返す
-
std::tuple
を使って返す
それぞれについて、順を追って説明します。
2.1 参照を使って複数の値を返す
参照を使うことで、関数から複数の値を返すことができます。この方法では、関数の引数として参照(&
)を使い、その参照を通じて値を変更します。返却される値は関数の外部で直接変更されます。
cpp#include
using namespace std;
// 参照を使って2つの値を返す関数
void calculate(int x, int y, int& sum, int& product) {
sum = x + y;
product = x * y;
}
int main() {
int a = 5, b = 3;
int sum, product;
// 関数を呼び出して値を変更
calculate(a, b, sum, product);
cout << "合計: " << sum << endl; // 合計: 8
cout << "積: " << product << endl; // 積: 15
return 0;
}
この例では、sum
とproduct
は参照渡しで渡されるため、関数内で値が変更され、その変更がmain
関数内にも反映されます。この方法は、複数の値を関数から返すのに非常に効率的です。
2.2 構造体やクラスを使って複数の値を返す
C++では、複数の値をまとめて返すために、構造体やクラスを使用することもできます。構造体は、異なる型の値を一つにまとめることができるので、複数の異なる値を返すのに適しています。
cpp#include
using namespace std;
// 構造体を使って複数の値を返す
struct Result {
int sum;
int product;
};
// 関数で構造体を返す
Result calculate(int x, int y) {
Result res;
res.sum = x + y;
res.product = x * y;
return res;
}
int main() {
int a = 5, b = 3;
// 関数呼び出しで構造体を受け取る
Result res = calculate(a, b);
cout << "合計: " << res.sum << endl; // 合計: 8
cout << "積: " << res.product << endl; // 積: 15
return 0;
}
この方法では、Result
という構造体を使って、sum
とproduct
をまとめて返します。構造体を使うことで、複数の値を一度に返すことができ、コードの可読性も向上します。
2.3 std::tuple
を使って複数の値を返す
std::tuple
を使用すると、異なる型の値を簡単にまとめて返すことができます。tuple
は、C++11以降で利用可能な機能で、構造体と似たような役割を果たしますが、より柔軟に異なる型の値を格納できます。
cpp#include
#include
using namespace std;
// tupleを使って複数の値を返す
tuple<int, int> calculate(int x, int y) {
return make_tuple(x + y, x * y);
}
int main() {
int a = 5, b = 3;
// tupleで返された値を受け取る
auto [sum, product] = calculate(a, b);
cout << "合計: " << sum << endl; // 合計: 8
cout << "積: " << product << endl; // 積: 15
return 0;
}
このコードでは、calculate
関数がstd::tuple
を返し、呼び出し元ではauto
と構造化束縛を使用してその値を取り出しています。この方法は、関数の戻り値として異なる型の値を返す際に非常に便利です。
3. 複数の値を返す方法の比較
-
参照を使う方法:関数内で変更した値が呼び出し元にも反映されます。直接的で効率的ですが、参照を使うため、呼び出し元で変更される値に注意が必要です。
-
構造体やクラスを使う方法:値をまとめて一つのオブジェクトとして返すことができ、コードの可読性が向上します。構造体やクラスを使うことで、関連する値をグループ化でき、柔軟性が増します。
-
std::tuple
を使う方法:複数の異なる型をまとめて返すことができ、使い方が簡単で直感的です。しかし、要素数や型が増えると、アクセスが少し煩雑になることもあります。
結論
C++で複数の値を返す方法にはさまざまな選択肢があり、それぞれの方法には利点と欠点があります。参照を使う方法は効率的であり、構造体やクラスを使う方法は可読性が高く、std::tuple
は柔軟性があります。目的に応じて、最適な方法を選択することが重要です。