C++の関数ポインタ(Function Pointer)とは?使い方と活用例をわかりやすく解説!
C++では、関数そのもののアドレス(場所)を変数として扱うことができます。
これを「関数ポインタ(Function Pointer)」と呼びます。
関数ポインタを使えば、関数を引数として渡す、実行時に処理を切り替えるといった柔軟な設計が可能になります。
関数ポインタとは?
関数ポインタとは、「ある型と引数を持つ関数のアドレス」を保持する変数のことです。
関数名の前に *
を付け、関数の「引数の型」と「戻り値の型」を指定して宣言します。
基本構文
// 戻り値: int、引数: int, int を受け取る関数ポインタ
int (*funcPtr)(int, int);
使用例:加算と減算
#include <iostream>
using namespace std;
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
int main() {
int (*calc)(int, int); // 関数ポインタの宣言
calc = add;
cout << "加算: " << calc(10, 5) << endl; // → 15
calc = subtract;
cout << "減算: " << calc(10, 5) << endl; // → 5
return 0;
}
この例では、calc
に関数 add
や subtract
のアドレスを代入し、実行時に処理を切り替えています。
関数ポインタを引数に渡す
void execute(int a, int b, int (*operation)(int, int)) {
cout << "結果: " << operation(a, b) << endl;
}
int main() {
execute(3, 7, add); // → 結果: 10
execute(3, 7, subtract); // → 結果: -4
}
このように、関数そのものを他の関数に渡すことができ、非常に柔軟な設計が可能になります。
関数ポインタの配列
int (*ops[2])(int, int) = { add, subtract };
int main() {
for (int i = 0; i < 2; i++) {
cout << ops[i](10, 4) << endl;
}
}
複数の関数をひとつの配列にまとめて、インデックスで切り替えることもできます。
関数ポインタのメリット
- 処理の切り替えが簡単にできる
- 関数の再利用性が高まる
- イベント処理やコールバックなどに最適
注意点
- 関数のシグネチャ(引数の数と型、戻り値)を正しく一致させる必要があります。
- ポインタの扱いに慣れていないと混乱しやすいので、まずはシンプルな例から始めると良いです。
まとめ
C++の関数ポインタは、関数を動的に選択したり、引数として渡すことができる非常に便利な仕組みです。
特に、コールバックやイベント処理、実行時の条件分岐などで力を発揮します。
まずは基本的な書き方と使用例に慣れ、少しずつ応用にチャレンジしてみましょう!