C++ の関数ポインタの Typedef
この記事では、C/C++ における typedef
の目的について説明します。 関数ポインターで typedef
を使用する方法と、それを使用する利点についてさらに説明します。
最初に typedef
とその一般的な使用法について説明しましょう。
typedef
キーワード
typedef は型定義を表します。 名前が示すように、typedef
は、既存のデータ型 (変数の型) に新しい名前を割り当てる方法です。
たとえば、整数変数を格納する場合、データ型は int になります。 同様に、文字または文字列のデータ型は、単語または句に使用されます。
#include <iostream>
#include <string>
using namespace std;
int main() {
int a = 10;
string greeting = "Hello!";
return 0;
}
typedef
の助けを借りて、使用されている実際の型から離れて、変数が何を意味するかという考えにもっと集中することができます。 これにより、きれいなコードを簡単に記述できるだけでなく、コードの編集もはるかに簡単になります。
たとえば、クリケットの試合後に 3 人の異なるプレーヤーの発言を記録する場合、typedef
を使用できます。
#include <iostream>
using namespace std;
int main() {
typedef char* statement;
statement PlayerA = "I played bad";
statement PlayerB = "I played very well";
statement PlayerC = " I could not get the chance to Bat";
cout << "Player A said:" << PlayerA;
return 0;
}
上記のコードでは、char*
は、新しい名前 statement
でこのデータ型を変更するために typedef
キーワードを適用した文字ポインタです。 この場合、プレーヤーの発言を記録しているため、この新しいエイリアスはより意味があります。
したがって、typedef
はコードの可読性を高めます。
typedef
は関数ポインタでも使用できます。 それに飛び込む前に、関数ポインタを簡単に紹介しましょう。
関数ポインタ
C++ では、ポインタは変数のメモリ アドレスを保持する変数です。 同様に、関数ポインターは、関数のアドレスを保持するポインターです。
関数ポインターは、次のコードで宣言できます。
int (*point_func)(int, int);
上記のコードで、point_func
は、引数として 2つの整数変数と戻り値の型として int を持つ関数を指すポインターです。
関数ポインターを使用した typedef
関数ポインタを持つ typedef
の構文は、どこか奇妙に見えます。 関数ポインター宣言の先頭に typedef
キーワードを配置するだけで済みます。
typedef int (*point_func)(int, int);
上記のコマンドは、point_func
(2つの int 引数を取り、整数を返す関数ポインター、つまり int (*) (int, int)
) という名前の新しい型を定義したことを意味します。 これで、この新しい名前をポインター宣言に使用できます。
次のプログラミング例を見てみましょう。
#include <iostream>
using namespace std;
int abc(int x1, int x2) { return (x1 * x2); }
int main() {
typedef int (*pair_func)(int, int);
pair_func PairProduct; // PairProduct is pointer of type pair_func
PairProduct = &abc; // PairProduct pointer holds the address of function abc
int product = (*PairProduct)(20, 5);
cout << "The product of the pair is: " << product;
return 0;
}
出力:
The product of the pair is: 100
関数ポインターの前に使用された場合に typedef
が何をするかは、ここまで明らかです。 abc
関数は 2つの引数を取り、上記のコードでそれらの積を返します。
main
関数では、typedef
を使用して関数ポインターの新しい名前を定義しました (つまり、pair_func
)。 次に、pair_func
型の PairProduct
を定義し、関数 abc
アドレスを割り当てました。
その後、ポインター PairProduct
を逆参照し (より単純な構文)、2つの引数を渡すことによって、関数 abc
を呼び出しました。