過負荷もファンクタ(ファンクタ)と呼ばれることが多いオブジェクト関数オブジェクト(関数オブジェクト)と呼ばれるクラスの関数呼び出し演算子、すなわち、それらは目的関数の挙動と類似しているが、実際に過負荷である「()」演算子、その結果可能な限り、関数呼び出しのようなクラスのオブジェクト。
注:関数オブジェクト(ファンクタ)クラス、関数ではなく。それは関数のように呼び出すことができるように、2機能オブジェクト(ファンクタ)は、「()」演算子をオーバーライドします。
(逆に、もしオーバーロードされた演算子、必要なパラメータを取得します)クラスは、オーバーロード演算子()、および、オーバーロード演算子を(持っていると仮定し、我々は、このクラス「シングル数子」(単項ファンクタ)を呼び出します)2つのパラメータを必要とするクラスは、「バイナリファンクタ」(バイナリファンクタ)と呼ぶことにします。
書式#include <iostreamの> の#include <ベクトル> の#include <アルゴリズム> 使用して 名前空間はstdを、 クラスFuncObject01 { パブリック: 無効 演算子()() { coutの << " Hello Worldの!" << てendl; } }。 空FuncObject02() { coutの << " Hello Worldの!" << てendl; } ボイドTEST01() { FuncObject01 fobj。 fobj(); FuncObject02(); COUT << " ----------------------- " << ENDL; } クラスFuncObject03 { パブリック: int型の 演算子()(int型 A、int型B) { 戻り A + B; } } ; INT FuncObject04(INT A、int型B) { 戻り A + B; } // 関数オブジェクトは、通常の関数と同じであってもよいが、戻り値とパラメータ有する ボイドTEST02() { ; FuncObject03 F OBJ INTを= F OBJ RET( 10、20である); COUT << " RET = " << RET << ENDL; RET = FuncObject04(10、30 ); COUT << " RET = " << RET << ENDL; COUT << " - ----------------------- 「 << てendl; } // 関数の通常の機能を超えた関数オブジェクトは、関数呼び出しが状態を保存している可能性があり // 我々は、例えば、関数呼び出しの数をカウントする クラスFuncObject05 { パブリック: )FuncObject05(:カウント( 0 ){} 空 演算子()() { coutの << " Hello Worldの!" << てendl; COUNT ++ ; } int型のCOUNT; }; // 共通の周波数の統計情報はグローバル変数必要とする関数を呼び出す int型 g_count = 0を、 無効FuncObject06() { COUT << " Hello Worldの!" << てendl; g_count ++ ; } 無効TEST03() { FuncObject06(); FuncObject06(); COUT << " 機能の数が呼び出されます:" << g_count << てendl; //は、グローバル変数を使用せずに関数オブジェクトを使用し FuncObject05 F OBJ; F OBJ(); F OBJ(); F OBJ(); COUT << " 関数呼び出しの時間を:" < <fobj.count << てendl; COUT << " --------------------------- " << てendl; } // 関数オブジェクトありませんパラメータと戻り値の クラスの印刷 { パブリック: 印刷():カウント( 0 ){} ボイド 演算子()(CONSTの INT&ヴァル) { COUT <<ヴァル<< " " 。 カウント ++ ; } int型のカウント。 }。 int型 NUM = 0 ; 無効 PRINT2(INT ヴァル) { COUT <<ヴァルを<< " " 。 NUM ++ ; } ボイドtest04() { ベクトル < INT > V。 v.push_back(1 )。 v.push_back(3 )。 v.push_back( 5 )。 v.push_back(2 ); //は、コンテナ要素を介しfor_eachアルゴリズム繰り返し 、印刷myPrintを // 関数オブジェクトパラメータと値が行う返す myPrint = for_each(v.begin()、v.end()、myPrint)を、 COUT << ENDL ; COUT << " 関数呼び出し回数:" << myprint.count << ENDL; for_each(v.begin()、v.end()、PRINT2); COUT << ENDL; COUT << " 関数呼び出し回数:" NUM << << ENDL; } int型のmain() { TEST01(); test04(); TEST02(); TEST03(); getchar関数(); リターン 0 ; }