2017年11月22日
《その147》 関数へのポインタを返す関数
関数へのポインタを返す関数
次のプログラムをみてください。赤文字の部分、ちょっと分かりにくいと感じる人もいるのではないでしょうか。自分はその一人なんですが・・・´・ω・`;)
// ------------------------------------------
#include <iostream>
using namespace std;
int a(int n) { // 2乗を計算
return n*n;
}
int b(int n) { // 2倍を計算
return 2 * n;
}
int (*c())(int) {
int tmp;
cout << "1(2乗) or 0(2倍) : "; cin >> tmp;
if (tmp) return a;
else return b;
}
int main() {
while (1) {
int num;
cout << "整数を入力(99 で終了) : "; cin >> num;
if (num == 99) break;
cout << (c())(num) << "\n\n";
}
}
// ------------------------------------------
関数 a, b は、int型の仮引数を受取り int型の値を返却します。
この関数 a, b へのポインタ型を fp型と名付ける場合、
typedef int (*fp)(int);
とすれば、fp という typedef名を登録できます。
分かりにくいのは、
int (*c())(int) { ・・・・・・ }
の箇所です。
これは、
int (*☆)(int) c() { ・・・・・・ }
と解釈されるようです。
つまり、
fp c() { ・・・・・・ }
ということです。
関数 c は、「引数無し」「返却値は関数へのポインタ」です。
関数 c 内で、関数 a, b を選択させて、選ばれたほうを返却します。
main関数内からの関数 c 呼出しは
(c())(num);
となっています。
c() の返却値は a, b のどちらかです。
a が返ってきた場合なら
a(num);
となって、num の2乗を求めることになります。
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6996353
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック