関数とは?
プログラミングを行っていると、同じような処理(ロジック)をプログラムのあちこちで実行したい場合があります。
例えば、ECサイトで「家電」カテゴリと「書籍」カテゴリのそれぞれ3つの主要商品の価格を入力し、各カテゴリの最高価格を表示するプログラムを考えてみましょう。
関数を使わずに作成すると、以下のようになります。
#include <iostream>
int main() {
    // --- 家電カテゴリの処理 ---
    int elec_price1, elec_price2, elec_price3;
    std::cout << "--- 家電カテゴリ ---\n";
    std::cout << "商品Aの価格: "; std::cin >> elec_price1;
    std::cout << "商品Bの価格: "; std::cin >> elec_price2;
    std::cout << "商品Cの価格: "; std::cin >> elec_price3;
    int max_elec = elec_price1; // 仮の最大値
    if (elec_price2 > max_elec) {
        max_elec = elec_price2;
    }
    if (elec_price3 > max_elec) {
        max_elec = elec_price3;
    }
    // --- 書籍カテゴリの処理 ---
    int book_price1, book_price2, book_price3;
    std::cout << "\n--- 書籍カテゴリ ---\n";
    std::cout << "書籍Xの価格: "; std::cin >> book_price1;
    std::cout << "書籍Yの価格: "; std::cin >> book_price2;
    std::cout << "書籍Zの価格: "; std::cin >> book_price3;
    int max_book = book_price1; // 仮の最大値
    if (book_price2 > max_book) {
        max_book = book_price2;
    }
    if (book_price3 > max_book) {
        max_book = book_price3;
    }
    std::cout << "\n--- 結果 ---\n";
    std::cout << "家電カテゴリの最高価格: " << max_elec << "円\n";
    std::cout << "書籍カテゴリの最高価格: " << max_book << "円\n";
    return 0;
}
このコードでは、「3つの価格から最大値を見つける」というロジックが2回、ほぼ同一の形で重複して記述されています。
**関数(Function)**は、このような特定の処理(ロジック)をひとまとめにし、名前を付け、再利用可能にするための仕組みです。処理の重複をなくすことで、コードは読みやすく、修正しやすいものになります。
関数定義 (Function Definition)
関数を利用するには、まずその関数が「どのようなデータを受け取り」「どのような処理を行い」「何を結果として返すか」を定義する必要があります。これを関数定義と呼びます。
/*
 * 戻り値の型: int (整数を返す)
 * 関数名: findHighestPrice
 * 仮引数リスト: (int p1, int p2, int p3) (3つの整数を受け取る)
 */
int findHighestPrice(int p1, int p2, int p3) {
    // --- 関数の本体 (Body) ---
    int highest = p1; // 受け取った値で仮の最大値を設定
    
    if (p2 > highest) {
        highest = p2;
    }
    if (p3 > highest) {
        highest = p3;
    }
    
    // return文: 呼び出し元に結果を返す
    return highest;
}
- 戻り値の型 (Return Type): 関数が処理を終えた後に返す値の型です(例: int)。何も返さない場合はvoidと記述します。
- 関数名 (Function Name): 処理を呼び出すために使用する名前です(例: findHighestPrice)。
- 仮引数 (Formal Parameter): 関数が呼び出し元からデータを受け取るための「窓口」となる変数です(例: p1,p2,p3)。関数定義で宣言される引数を「仮引数」と呼びます。
関数の呼び出し (Function Call)
関数を定義したら、「関数名(実引数)」という形式でその処理を呼び出すことができます。
先ほどのプログラムを、先ほど定義した findHighestPrice 関数を使って書き換えると、以下のようになります。
#include <iostream>
// (ここに findHighestPrice 関数の定義を置く)
// ※ main関数より前に関数定義を記述する必要があります
int findHighestPrice(int p1, int p2, int p3) {
    int highest = p1;
    if (p2 > highest) {
        highest = p2;
    }
    if (p3 > highest) {
        highest = p3;
    }
    return highest;
}
int main() {
    // --- 家電カテゴリの処理 ---
    int elec_price1, elec_price2, elec_price3;
    std::cout << "--- 家電カテゴリ ---\n";
    std::cout << "商品Aの価格: "; std::cin >> elec_price1;
    std::cout << "商品Bの価格: "; std::cin >> elec_price2;
    std::cout << "商品Cの価格: "; std::cin >> elec_price3;
    // findHighestPrice 関数を呼び出し、結果を変数に代入
    int max_elec = findHighestPrice(elec_price1, elec_price2, elec_price3);
    // --- 書籍カテゴリの処理 ---
    int book_price1, book_price2, book_price3;
    std::cout << "\n--- 書籍カテゴリ ---\n";
    std::cout << "書籍Xの価格: "; std::cin >> book_price1;
    std::cout << "書籍Yの価格: "; std::cin >> book_price2;
    std::cout << "書籍Zの価格: "; std::cin >> book_price3;
    // 別の値で関数を再度呼び出す
    int max_book = findHighestPrice(book_price1, book_price2, book_price3);
    
    // (参考) リテラル(定数値)を直接渡すことも可能
    // int max_test = findHighestPrice(100, 500, 300);
    std::cout << "\n--- 結果 ---\n";
    std::cout << "家電カテゴリの最高価格: " << max_elec << "円\n";
    std::cout << "書籍カテゴリの最高価格: " << max_book << "円\n";
    return 0;
}
仮引数と実引数、返却値
関数を呼び出す際の重要な概念を整理します。
1. プログラムの流れ
max_elec = findHighestPrice(elec_price1, ...); のように関数呼び出し式が実行されると、プログラムの流れは main 関数から findHighestPrice 関数の先頭へと移ります。
2. 実引数 (Actual Argument)
関数を呼び出す際に渡す具体的な値や変数のことを実引数と呼びます(例: elec_price1)。
3. 仮引数の初期化
関数が呼び出されると、findHighestPrice の仮引数 p1, p2, p3 が、渡された実引数 elec_price1, elec_price2, elec_price3 の値で初期化されます(値がコピーされます)。
4. 返却値 (Return Value)
関数内で return highest; が実行されると、highest 変数の値が関数の返却値として呼び出し元に返されます。
プログラムの流れは main 関数に戻り、findHighestPrice(...) という式全体がその返却値(例: 50000)に置き換わったかのように動作します。その結果、max_elec には 50000 が代入されます。
5. 引数と返却値の特性
- 関数は複数の仮引数(データ)を受け取ることができます。
- 関数が return文で返却できる値は、原則として1つだけです。
main 関数も、int main() と定義される通り、「OSに対して int 型の値(通常は 0=正常終了)を返す関数」の一種です。

 
			 
			 
			 
			 
			 
			 
			