0

() 演算子をオーバーロードする方法について疑問に思っていました

例えば

class A{
    int a,b;
public:
    void operator()(int x, int y);
};

void A::operator()(int x, int y){
    x = a;
    y = b;
}

int main(){
    A a = new A();
    a(5,4); // this will call the overloaded operator
    return 0;
}

以下に他のユースケースがあるかどうか、およびこれを呼び出すことができる他のシナリオがあるかどうか疑問に思っていました。

4

2 に答える 2

3

operator()他の機能と同じです。唯一の違いは、 like と呼ぶのではなくa.foo()、 と書くことa()です。

他の関数とまったく同じように使用でき、必要なだけオーバーロードでき、必要な数のパラメーター (ゼロを含む) を持つことができ、テンプレート化することができ、他の関数と考えることができるものは何でも使用できます。できる。

于 2012-11-07T02:29:12.387 に答える
0

一般に、operator() はオブジェクト関数呼び出しセマンティクスを与えるために使用されます。オブジェクトが「何かをしている」と見なされる場合は、この演算子を使用するのが理にかなっています。これらのオブジェクトはファンクターと呼ばれます。多くの場合、特に多くのオブジェクトで繰り返し実行されるアクションをカプセル化するために使用されます。

興味深い例と使用法については、STL ヘッダーalgorithmを参照してください。functional

ところで、A を割り当てていますが、ポインターではなくオブジェクトに割り当てています。そして、A を割り当てているときに your を呼び出してA::operator()おり、コンパイラは文句を言う必要があります。メインの実行を超えて存在する必要がないため、次のようなものまたはより単純なA a = new A()ものに変更します。ポインターバージョンを使用する場合は、そのように呼び出す必要がありますA* a = new A;A a;aoperator()(*a)(5,4);

また、あなたのA::operator()意志は効果がありません。および引数は値渡しですxy代わりに参照渡ししてください。

于 2012-11-07T02:37:59.210 に答える