C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++の関数から複数の値を返す方法【ポインタ渡しと参照渡し】

C言語やC++では、関数から複数の値を直接返すことはできません。return文で返せる値は基本的に1つだけだからです。しかし、「ポインタ渡し(call by address)」や「参照渡し(call by reference)」といったテクニックを使えば、実質的に複数の値を呼び出し元に返すことが可能です。

この記事では、1つの関数から2つの数値を割り算した「商」と「余り」を同時に取得する例を通して、その具体的な方法を解説します。

方法1:ポインタ渡し(Call By Address)

ポインタ渡しでは、結果を格納するための変数を呼び出し側で用意し、その変数のアドレスを関数に渡します。関数内ではポインタを受け取り、その指す先(*演算子による間接参照)に計算結果を書き込みます。

サンプルコード

#include<iostream>
using namespace std;

void div(int a, int b, int *quotient, int *remainder) {
    *quotient = a / b;
    *remainder = a % b;
}

int main() {
    int a = 76, b = 10;
    int q, r;
    div(a, b, &q, &r);
    cout << "商は: " << q << "\n余りは: " << r << "\n";
    return 0;
}

実行結果

商は: 7
余りは: 6

この例では、div関数がint*型の引数を2つ受け取っています。呼び出し側では変数qrのアドレスを&演算子で渡すことで、関数内での書き換えがそのまま呼び出し元の変数に反映されます。

方法2:参照渡し(Call By Reference)

C++では、ポインタよりも安全で直感的な「参照渡し」を使うこともできます。参照渡しでは、関数の引数に&を付けた参照型を使用します。呼び出し側は通常の変数をそのまま渡すだけでよく、アドレス演算子は不要です。

サンプルコード

#include<iostream>
using namespace std;

void div(int a, int b, int &quotient, int &remainder) {
    quotient = a / b;
    remainder = a % b;
}

int main() {
    int a = 76, b = 10;
    int q, r;
    div(a, b, q, r);
    cout << "商は: " << q << "\n余りは: " << r << "\n";
    return 0;
}

実行結果

商は: 7
余りは: 6

参照渡しでは、関数内で引数に対して行った操作が、そのまま呼び出し元の変数qrに反映されます。ポインタのように*&を意識する必要がなく、コードが読みやすくなるのがメリットです。

補足:C++11以降ならタプルも使える

C++11以降では、std::tuplestd::make_tuple、あるいは構造化束縛(C++17)を利用して、複数の値を戻り値として直接返すこともできます。

#include<iostream>
#include<tuple>
using namespace std;

tuple<int, int> div(int a, int b) {
    return make_tuple(a / b, a % b);
}

int main() {
    auto [q, r] = div(76, 10); // C++17の構造化束縛
    cout << "商は: " << q << "\n余りは: " << r << "\n";
    return 0;
}

まとめ

  • C/C++では関数から複数の値を直接返せないが、ポインタ渡しや参照渡しで実現できる
  • ポインタ渡しは変数のアドレスを渡し、関数内で間接参照して値を書き込む
  • 参照渡しはC++特有の機能で、よりシンプルで安全に記述できる
  • C++11以降ではstd::tupleなどを使ったモダンな方法も選択肢になる

用途やコーディング規約に応じて、これらの手法を使い分けるとよいでしょう。

  1. Python入門:関数から複数の値を返す方法

    Pythonでは、関数から複数の値を返すことができます。戻り値として辞書・タプル・リストなどのデータ型を利用すれば、複数の値をまとめてメインプログラムに渡せます。さらに、値をカンマで区切って直接返す方法もあります。 Pythonで関数から複数の値を返すには Pythonの関数から複数の値を返す主な方法は、以下の4つです。 複数の値を含むリストを返す 複数の値を含むタプルを返す 複数のキーと値を持つ辞書を返す 値をカンマで区切って返す これらのデータ型はいずれも複数の値を格納できます。中でも、カンマ区切りで返す方法が最もシンプルで意図が伝わりやすいでしょう。この方法なら「複数の独立した

  2. JavaScriptのコンストラクターから値を返す方法

    JavaScriptのコンストラクターから値を返すには?JavaScriptでは、コンストラクター関数内で明示的にオブジェクトをreturnすると、new演算子によって生成されるインスタンス(this)の代わりに、そのオブジェクトが結果として返されます。この仕組みを利用すると、コンストラクターの戻り値を柔軟に制御できます。以下は、JavaScriptのコンストラクターから値を返すコード例です。サンプルコード<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-