14.

【C++】関数の定義と呼び出し方|構文・引数・戻り値・オーバーロード

編集
この記事の要点
  • 関数は「処理に名前を付けて再利用する仕組み」。C++では「戻り値の型 関数名(引数) { 処理 }」で定義する
  • 関数を使う前に定義かプロトタイプ宣言が必要。main()より下に定義する場合は先頭にプロトタイプを書く
  • returnは戻り値を返して呼び出し元に処理を戻す。voidは戻り値なしを表す
  • 引数は値渡しが基本。元の変数を書き換えたい場合は参照渡し(&)やポインタを使う
  • 関数化で重複コードを排除でき、可読性・保守性・テスト容易性が向上する
  • 同名で引数が異なる関数を複数定義できる(オーバーロード)

概要

関数とは、一連の処理に名前を付けてまとめ、何度でも呼び出せるようにした仕組みです。同じ計算や処理をプログラムのあちこちに書く代わりに関数化しておけば、呼び出すだけで再利用でき、修正も一箇所で済みます。ここではC++を例に、関数の定義(作り方)と呼び出し(使い方)を、構文・引数・戻り値の観点から整理します。

関数の構文

C++の関数は「戻り値の型 関数名(引数リスト) { 処理 }」という形で定義します。引数は外から渡す入力、戻り値はreturnで呼び出し元へ返す結果です。

#include <iostream>
using namespace std;

// 2つの整数を受け取り、その和を返す関数
int sum(int x, int y) {
    int s = x + y;
    return s;          // 戻り値を返して呼び出し元へ戻る
}

int main() {
    int result = sum(1, 2);   // 関数の呼び出し
    cout << result << "\n";
    return 0;
}

このプログラムを実行すると、sum(1, 2)3 を返し、次のように出力されます。

3

戻り値を返さない関数は型に void を指定します。この場合 return; は省略可能です。

void greet(string name) {
    cout << "Hello, " << name << "!\n";
}

使い方・手順

1. プロトタイプ宣言(前方宣言):C++は上から順にコンパイルするため、関数を呼び出す位置より後ろに定義を書く場合は、ファイル先頭で「宣言」だけ先に書いておきます。

#include <iostream>
using namespace std;

int sum(int x, int y);   // プロトタイプ宣言(本体は後ろ)

int main() {
    cout << sum(10, 20) << "\n";   // 定義より前で呼べる
    return 0;
}

int sum(int x, int y) {  // 関数の定義(本体)
    return x + y;
}

2. 呼び出し:関数名に引数を渡して呼びます。戻り値は変数に受け取るか、式の中で直接使えます。

int a = sum(3, 4);              // 変数に代入
cout << sum(a, 5) << endl;   // 式の中で直接使用

実用例・Tips

値渡しと参照渡し:C++の引数は既定で値渡し(コピーが渡る)です。関数内で引数を書き換えても呼び出し元の変数は変わりません。元の変数を変更したい場合は参照渡し(&)を使います。

// 参照渡し:呼び出し元の x が書き換わる
void doubleIt(int &x) {
    x = x * 2;
}

int main() {
    int n = 5;
    doubleIt(n);   // n は 10 になる
    cout << n << "\n";
}

関数オーバーロード:同じ名前でも引数の型や個数が異なれば複数定義できます。コンパイラが呼び出し時の引数から適切な方を選びます。

int    add(int a, int b)       { return a + b; }
double add(double a, double b) { return a + b; }   // 同名・別引数でOK

デフォルト引数:引数に既定値を設定すると、呼び出し時に省略できます。

int power(int base, int exp = 2) {  // exp 省略時は 2
    int r = 1;
    for (int i = 0; i < exp; i++) r *= base;
    return r;
}
// power(3) は 9、power(3, 3) は 27

注意点・落とし穴

  • 戻り値の取り忘れ:戻り値がある関数で return を書き忘れると未定義動作になる。
  • 型の不一致:戻り値の型と return する値の型が合わないと暗黙変換が起き、想定外の結果になることがある。
  • 未宣言エラー:定義より前で呼ぶならプロトタイプ宣言が必須。忘れると「未宣言」エラーになる。
  • 巨大オブジェクトの値渡し:大きな構造体やクラスを値渡しすると毎回コピーが発生して遅い。const参照(const T&)で渡すと効率的。
  • ローカル変数の参照を返さない:関数内で作ったローカル変数の参照やポインタを返すと、関数終了後に無効になる。

関連リンク

関数は制御構文や変数と並ぶプログラミングの基礎です。「文法」カテゴリの変数・演算子・制御構文の各記事と合わせて学ぶと、関数を組み合わせた実用的なコードが書けるようになります。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. コメントアウト
  2. 文字列の結合/連結
  3. 変数の宣言
  4. 定数の宣言
  5. if文
  6. if文の論理演算子
  7. for文
  8. データ型(文字列以外)
  9. データ型(文字列)
  10. 配列とfor文
  11. 配列の要素数
  12. 多次元配列とfor文
  13. 多次元配列の要素数
  14. 関数の定義と呼び出し

最近更新/作成されたページ