C++関数を実例で徹底解説:基本から応用まで
C++における関数とは
C++の関数は、入力を受け取り、処理を行い、結果を返す自己完結型のコードブロックです。繰り返し実行されるタスクを関数にカプセル化することで、コードの重複を避け、異なるパラメータを渡すだけでプログラム全体でロジックを再利用できます。
すべてのC++アプリケーションには最低1つの関数main()が含まれます。それ以外のコードは、より小さな目的別の関数に整理することで、可読性と保守性が向上します。
モダンC++では、標準ライブラリに豊富な組み込み関数が用意されています。これらは実装を自分で書くことなく直接呼び出せます。
このチュートリアルでは以下を学びます:
- C++における関数の定義
- 関数が不可欠な理由
- 組み込みライブラリ関数
- ユーザー定義関数
- 関数宣言とプロトタイプ
- 関数定義
- 構文と構造
- 関数の呼び出し方
- 引数の渡し方
なぜ関数を使うのか
関数には複数の利点があります:
- 関連するステートメントをグループ化し、コードを読みやすく、理解しやすくする。
- 重複を排除し、エラーの可能性を減らす。
- 同じ関数を呼び出すだけで、プログラムの異なる部分や、プロジェクト間でコードを再利用できる。
組み込み関数
標準ライブラリ関数は事前に定義されており、すぐに使用可能です。単に呼び出すだけで、実装を提供する必要はありません。
例1:cmathからsqrt()を使用
#include <iostream>
#include <cmath>
using namespace std;
int main() {
double num, squareRoot;
cout << "Enter number: ";
cin >> num;
squareRoot = sqrt(num);
cout << "The square root of " << num << " is: " << squareRoot;
return 0;
}
出力:

プログラム実行時のスクリーンショット:

コード解説:
- 入出力用に
iostreamをインクルード。 sqrt()関数にアクセスするためcmathをインクルード。- 標準名のプレフィックスを避けるため
std名前空間を使用。 - プログラムロジックが存在する
main()関数を定義。 numとsquareRootをdoubleで宣言。- ユーザーに数値入力を促す。
- ユーザー入力を
numに読み込み。 sqrt()を呼び出し、numの平方根を計算。- 結果を表示。
- 正常終了を示す0を返却。
ユーザー定義関数
開発者は、アプリケーション固有のロジックをカプセル化するカスタム関数を作成できます。
例2:シンプルな挨拶関数
#include <iostream>
using namespace std;
void sayHello() {
cout << "Hello!";
}
int main() {
sayHello();
return 0;
}
出力:

コードのスクリーンショット:

解説:
- コンソールI/O用に
iostreamをインクルード。 std名前空間をスコープに導入。- 挨拶を出力する
sayHello()関数を定義。 main()からsayHello()を呼び出し。- 正常終了を示す0を返却。
関数宣言 / プロトタイプ
関数がmain()より後に定義される場合、コンパイラは事前にそのシグネチャを知る必要があります。プロトタイプは関数本体なしでこの情報を提供します。
プロトタイプの例:
int addFunc(int, int);
戻り値の型、関数名、パラメータの型のみ必須。パラメータ名は省略可能。
関数定義
プロトタイプがコンパイラに関数のインターフェースを伝えるのに対し、定義は実行可能な本体を提供します。
定義の例:
int addFunc(int num1, int num2) {
return num1 + num2;
}
構文
return_datatype function_name(parameter_list) {
// function body
}
主要コンポーネント:
- return_datatype - 返される値の型(値を返さない場合は
void)。 - function_name - 関数シグネチャの一部となる識別子。
- parameter_list - 0個以上の型付きパラメータ。
- function body - タスクを実行するステートメント群。
関数の呼び出し
関数を実行するには、名前で呼び出し、必要な引数を渡す必要があります。
呼び出し例:
int result = addFunc(3, 5);
引数の渡し方
引数は関数のパラメータリストと、個数と型の両方で一致する必要があります。不一致の引数はコンパイル時エラーになります。
デフォルトパラメータ値を指定すると、呼び出し側がそれらの引数を省略できるようになります。
例3:プロトタイプを使った2数の加算
#include <iostream>
using namespace std;
int addFunc(int, int); // プロトタイプ
int main() {
int x, y, sum;
cout << "Enter two numbers: ";
cin >> x >> y;
sum = addFunc(x, y);
cout << "The sum of " << x << " and " << y << " is: " << sum;
return 0;
}
int addFunc(int num1, int num2) {
return num1 + num2;
}
出力:

スクリーンショット:

解説:
- 必要なヘッダーと名前空間をインクルード。
addFunc()のプロトタイプを宣言。- ユーザーから2つの整数を読み取り。
- それらの値で
addFunc()を呼び出し、結果を格納。 - 合計を表示。
main()の後にaddFunc()を定義し、2つのパラメータを加算するロジックを提供。
まとめ
- 関数は関連コードを再利用可能なブロックにグループ化する。
- 重複を減らし、コードの明確性を向上させる。
- 組み込みライブラリ関数はヘッダー経由で利用可能。ユーザー定義関数は宣言と定義が必要。
- 関数プロトタイプは実際の定義の前にコンパイラに情報を伝える。
- 引数の個数と型の一致は必須。デフォルト引数で柔軟性を確保。
C言語
- C++ do-while文:構文、実践例、ネストしたループ
- C++ポインタをマスター:概念、例、実践的応用
- C++ char型をマスター:宣言、ASCII、変換テクニック
- C++演算子オーバーロード:コード例付き実践ガイド
- C言語のcalloc():ゼロ初期化メモリ割り当てと実践例
- C言語の関数マスター:構造、宣言、ベストプラクティス
- C++ポリモーフィズム完全理解:仮想関数と純粋仮想関数
- Verilog関数のマスター:効率的なRTL設計のために
- Pythonラムダ関数をマスターする:実例とベストプラクティス
- Python round()関数を実例で徹底解説
- Python map()関数をマスター:構文、例、ベストプラクティス