【C++】関数ポインタのメモ

関数ポインタ概要

関数は実行コードの開始アドレスを持っている。
このアドレスをポインタに格納することができる。
このポインタを関数ポインタという。

このポインタを使って、関数を呼び出すことができる

宣言例

  int foo(int n); //int型を返す関数foo
  int *bar(int n); //int型へのポインタを返す関数bar
  int (*buzz)(int n); //int型を返す関数へのポインタbuzz

  /*
   * 2つのint型引数を持ちint型を返す関数、へのポインタ
   * 引数の名前は省略できる
   */
  int (*calc)(int, int);

  /*
   * 何度も同じ関数ポインタを利用するときは、
   * 予めtypedefで設定しておくと便利
   */
   typedef int (*Func)(int, int);
   Func func;

関数ポインタの使用例

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

typedef int (*Calc)(int, int);
Calc calc;

int add(int a, int b)
{
  return a+b;
}
int sub(int a, int b)
{
  return a-b;
}

int main(){
  calc = add;
  cout << calc(30, 20) << endl;
  calc = sub;
  cout << calc(30, 20) << endl;
  return 0;
}

クラスのメンバ関数へのポインタの表記

class MyClass{
 public:
  int data;
  void func(int a);
};

int MyClass::* dp;
void (MyClass::* fp)(int);
// typedef void (MyClass::* fp)(int);