3

私はいくつかのC++コードを調べて、次のことに出くわしました

void Classname::operator()()
{   
    //other code here
}

これはコンストラクターのオーバーロードと関係があると思いますが、誰かがそれについて詳しく説明できますか?

4

4 に答える 4

4

operator()関数呼び出し演算子です。これにより、関数のようなクラスインスタンスを使用できます。

Classname instance;
instance(); //Will call the overload of operator() that takes no parameters.

これは、ファンクターやその他のさまざまなC++テクニックに役立ちます。基本的に「関数オブジェクト」を渡すことができます。これは、のオーバーロードを持つ単なるオブジェクトですoperator()。したがって、それを関数テンプレートに渡し、関数テンプレートはそれを関数であるかのように呼び出します。たとえば、Classname::operator()(int)が定義されている場合:

std::vector<int> someIntegers;
//Fill in list.
Classname instance;
std::for_each(someIntegers.begin(), someIntegers.end(), instance);

これにより、リスト内の整数ごとにinstanceのメンバーが呼び出されます。オブジェクトにoperator()(int)メンバー変数を含めることができるため、必要な処理を実行できます。これらのメンバー変数は非グローバルデータであるため、これは生の関数を渡すよりも柔軟性があります。instanceoperator()(int)

于 2011-10-06T03:11:38.670 に答える
3

それはあなたのクラスを「Functor」と呼ばれるオブジェクトにします...それはオブジェクトに状態を埋め込むためにクロージャタイプのオブジェクトとしてしばしば使用され、それが関数であるかのようにオブジェクトを呼び出しますが、内部静的変数で「状態」を管理しようとする従来のC関数の場合のように、グローバルにアクセス可能な静的変数の欠点のない「状態性」を備えています。

たとえば、

void Classname::operator()()
{   
    //other code here
}

のインスタンスはのClassnameように呼び出すことができ、引数をとらない関数class_name_instance()のように動作します。void

于 2011-10-06T03:13:14.557 に答える
0

コンストラクターをオーバーロードしているのではなく、関数呼び出し演算子をオーバーロードしています。これをクラスに対して定義すると、クラスのインスタンスを関数であるかのように呼び出すことができます。このようなオブジェクトは、一般にファンクターと呼ばれます。

于 2011-10-06T03:11:39.643 に答える
0

これは、演算子'()'をオーバーロードするコードです。これにより、基本的に、クラスをパラメーターなしの関数として使用できるようになります。次のようなものもあります。

SomeOtherClass Classname::operator ()(Argument1 a, Argument2 b, *[etc]*); and use it like:
Classname instance;
SomeOtherClass someother =  instance(arg1, arg2);

オーバーロードの詳細については、 Operators_in_C_and_C++を確認してください。

于 2011-10-06T03:16:28.430 に答える