関数 C++ の例

Guan Shu C No Li



関数のように動作する C++ クラスはファンクターと呼ばれます。ファンクターの呼び出しには、同じ古い関数呼び出し構文が使用されます。 「operator()」をオーバーロードするオブジェクトを作成してファンクターを生成します。関数または関数ポインターとして解釈されるオブジェクトはファンクターと呼ばれるとも言えます。パラメトリック データ型の値を使用して関数効果をモデル化する場合、「ファンクター」は非常に便利です。この記事では、C++ コードとともにファンクターの概念について詳しく説明します。

例 1:

「iostream」は、このヘッダー ファイルで宣言されている関数を利用する必要があるため、ここに含めるヘッダー ファイルです。 「iostream」ヘッダー ファイルには関数宣言が含まれています。 「std」名前空間もここに追加されます。次に、「FunctorClass」というクラスを生成します。その下に、ここではパブリック コンストラクターである「public」と入力し、「operator()」関数を配置します。次に、画面上に表示したい文を「cout」ステートメントに配置します。

この後、「main()」関数を呼び出し、「my_functor」という名前で「FunctorClass」のオブジェクトを作成します。ここでは、「my_functor()」関数を呼び出して、「operator()」関数の下に追加したステートメントを表示します。







コード 1:



#include
を使用して 名前空間 標準 ;
クラス ファンクタークラス {
公共 :
空所 オペレーター ( ( {
コート << 「ここに作戦が呼び出されます」 ;
}
} ;
整数 主要 ( {
FunctorClass my_functor ;
my_functor ( ;

戻る 0 ;
}

出力:



ここでは「FunctorClass」の「operator()」関数内に追加した行を「my_functor」ファンクターオブジェクトを利用して表示しています。





例 2:

一部の関数宣言が「iostream」ヘッダー ファイルに含まれているため、ここに「iostream」ヘッダー ファイルを含めます。 「std」名前空間も挿入されます。次に、「SquareClass」という名前のクラスを作成します。



その下に、パブリック コンストラクターである「public」と入力し、その下に「int」データ型の「operator()」関数を配置します。 「int」データ型の「val」変数をこの「operator()」関数に渡します。この関数は、「operator()」関数の下の「return()」関数に「val * val」を挿入したため、乗算結果を返します。

ここで「main()」関数が呼び出されます。すると、ここでは「SquareFunctor」クラスの「s_functor」という名前でオブジェクトが作成されます。次に、情報のレンダリングを支援する「cout」を利用します。この後、ここで「my_functor()」オブジェクトを関数のように呼び出します。呼び出し時にパラメータとして「5」を追加したため、乗算結果「5 * 5」が返されます。

コード 2:

#include
を使用して 名前空間 標準 ;
クラス スクエアクラス {
公共 :
整数 オペレーター ( ( 整数 ヴァル {
戻る ( ヴァル * ヴァル ;
}
} ;
整数 主要 ( {
SquareClass s_functor ;
コート << '指定された値の 2 乗は ' << 終わり ;
コート << s_function ( 5 ;

戻る 0 ;
}

出力:

「SqaureClass」クラスの「my_functor」オブジェクトを「my_functor()」関数のように呼び出して「5」を渡すと、出力が得られます。数字「5」の二乗として「25」が得られます。

例 3:

「iostream」ヘッダー ファイルは関数宣言が含まれているためここに含まれており、その後「std」名前空間が導入されます。次に、「ProductFunctor」クラスが作成されます。パブリック コンストラクター「public」がその下に入力され、「int」データ型の「operator()」関数がその下に配置されます。ここでこの関数をオーバーライドし、2 つのパラメーター「int var1」と「int var2」を渡します。

次に、この下の「return」を利用して両方の変数を乗算し、両方の数値の乗算結果「var1 * var2」を返します。次に、ここで「main()」関数が呼び出され、「ProductFunctor」クラスの「P_functor」という名前のクラス オブジェクトが生成されます。次に、「pro_result」という名前の新しい変数を初期化し、呼び出し後に「P_functor」オブジェクトを「P_functor()」関数として割り当てます。

「28」と「63」をパラメータとして渡します。これにより、両方の値が乗算され、その結果が「pro_result」変数に保存されます。この変数では、「cout」を使用して「pro_result」を渡し、この下に出力します。

コード 3:

#include
を使用して 名前空間 標準 ;
クラス プロダクトファンクター {
公共 :
整数 オペレーター ( ( 整数 var1、 整数 var2 {
戻る var1 * var2 ;
}
} ;
整数 主要 ( {
ProductFunctor P_ファンクター ;
整数 生産結果 = P_関数 ( 28 63 ;
コート << 「製品は次のとおりです。」 << 生産結果 << 終わり ;
戻る 0 ;
}

出力:

「P_functor」オブジェクトを「P_functor()」関数として呼び出し、それに値を渡すと、積が得られます。これらの値の積は「1764」です。

例 4:

このインスタンスでは「GreetingFunctorClass」が生成されます。次に、「public」コンストラクターを挿入し、この「public」コンストラクター内の「operator()」関数をオーバーライドします。 「こんにちは!」と入力します。 「operator()」関数の下に「cout」を配置した後、「私は C++ プログラマーです」と入力します。

ここからは「main()」を呼び出します。ここでは「GreetingFunctorClass」のオブジェクトとして「g_functor」を作成し、この「g_functor」オブジェクトを「g_functor()」関数として呼び出します。これにより、「operator()」関数をオーバーライドするときに追加した結果が得られます。

コード 4:

#include
を使用して 名前空間 標準 ;
を使用して 名前空間 標準 ;
クラス 挨拶ファンクタークラス {
公共 :
空所 オペレーター ( ( {
コート << 「こんにちは!私はここの C++ プログラマーです」 ;
}
} ;
整数 主要 ( {
GreetingFunctorClass g_functor ;
g_function ( ;
戻る 0 ;
}

出力:

ここで、クラス オブジェクトを関数のように呼び出すと、コード内の「operator()」関数をオーバーライドしたときに追加したステートメントがここに表示されることに気づくかもしれません。

例 5:

今回は「bits/stdc++.h」に必要な関数宣言がすべて含まれているので含めます。そして、「std」名前空間がここに配置されます。ここで作成するクラスは「incrementFunctor」クラスです。次に、「プライベート」コンストラクターを作成し、「int_num」変数を「int」データ型で初期化します。

この「public」コンストラクターの下に「incrementFunctor」を配置し、その中に「int n1」を渡します。次に、「:」を配置した後に「int_num(n1)」と入力します。次に、「int」データ型の「operator()」関数をオーバーライドし、ここで「int arrOfNum」を宣言します。次に、「return」を使用して「int_num + arrOfNum」を挿入します。これで、「arrOfNum」の値がインクリメントされ、「int_num」の値が追加されて、ここに返されます。

「main()」を呼び出した後、「arrOfNum」を初期化し、ここで別の整数値を割り当てます。次に、「sizeof(arrOfNum)/sizeof(arrOfNum[0])」のような「sizeof」関数を追加して、「n1」変数が初期化されます。その後、「additionNumber」は「3」で初期化されます。ここでは「transform()」関数を利用します。この「transform()」は、「increammentFunctor」クラスのオブジェクトを作成し、そのオブジェクトを呼び出すことと同じです。この後、「for」ループを使用して、「arrOfNum[i]」を「cout」します。

コード5:

#include
を使用して 名前空間 標準 ;
クラス インクリメントファンクター
{
プライベート :
整数 int_num ;
公共 :
インクリメントファンクター ( 整数 n1 : int_num ( n1 { }
整数 オペレーター ( ( 整数 arrOfNum 定数 {
戻る int_num + arrOfNum ;
}
} ;
整数 主要 (
{
整数 arrOfNum [ = { 6 3 2 1 9 0 8 } ;
整数 n1 = のサイズ ( arrOfNum / のサイズ ( arrOfNum [ 0 ;
整数 加算番号 = 3 ;
変身 ( arrOfNum、arrOfNum + n1、arrOfNum、incrementFunctor ( 加算番号 ;

のために ( 整数 = 0 ; < n1 ; ++
コート << arrOfNum [ << 「」 ;
}

出力:

コードの結果がここに示されています。ここでは、「incrementFunctor」が関数として利用される「Functor」です。

例 6:

このコードでは、事前定義された「より大きな」ファンクターを利用します。ここでは、コード内で必要な関数またはメソッドがヘッダー ファイル内で宣言されているため、コード内で必要な 4 つの異なるヘッダー ファイルを含めます。次に、「std」を追加して「main()」を呼び出した後、「myIntegerVector」ベクトルを初期化します。このベクトルにいくつかの未ソートの値を挿入します。この下では、「sort」関数を適用してこれらのベクトル値を並べ替えます。

この関数を使用すると、値が昇順に並べ替えられます。ただし、ここでは「greater」を利用します。これは、降順でソートの結果を与える C++ の事前定義関数です。この後、「for」ループを使用してソートされた値を表示し、次に「cout」を使用します。

コード6:

#include
#include <アルゴリズム>
#include <ベクター>
#include <機能>
を使用して 名前空間 標準 ;

整数 主要 ( {
ベクター < 整数 > myIntegerVector = { 13 21 19 44 32 42 9 6 } ;
選別 ( myIntegerVector。 始める ( 、myIntegerVector。 終わり ( 、より大きい < 整数 > ( ;
のために ( 整数 vec_num : myIntegerVector {
コート << vec_num << 「」 ;
}
戻る 0 ;
}

出力:

ベクトルのすべての値は、C++ の事前定義されたファンクター (「大きい」ファンクター) を使用して降順にソートされます。その定義は「関数型」ヘッダー ファイルで利用できます。

結論

この記事では、「ファンクター C++」の概念について詳しく説明します。私たちは、オブジェクトを関数として呼び出して、「operator()」と呼ばれる関数をオーバーロードできることを研究しました。これはファンクターとして知られています。 「operator()」のオーバーロードを意図したとおりに利用するには、パブリック アクセスを提供する必要があります。コード内で「ファンクター」と事前定義された「ファンクター」を利用するさまざまな例を示しました。