5

次のような加算器ファンクターを定義、インスタンス化、および使用するとします。

class SomeAdder {
    public:
        SomeAdder(int init_x): x(init_x) {}
        void operator()(int num) { cout << x + num <<endl; }
    private:
        int x;
};

SomeAdder a = SomeAdder (3);
a(5); //Prints 8

SomeAdder b(5);
b(5); //Prints 10

コンストラクターとオーバーロードされた()演算子は両方とも二重括弧を使用して呼び出され、同じタイプのパラメーターを持ちます。SomeAdderコンパイラは、正しい動作を実装するために、のインスタンス化および「関数呼び出し」中に使用する関数をどのように決定しますか?答えは一見明らかなようですが、私はこの考えに頭を悩ませることはできません。

御時間ありがとうございます!

4

3 に答える 3

4

あなたの例では、コンストラクターとオーバーロードするメンバー関数operator()を比較しています。コンパイラは、どれをいつ呼び出すかを知っています。それはかなり簡単です:

  • オブジェクトを作成する場合は、コンストラクターが呼び出されます。

  • メンバー関数は、すでに構築されているオブジェクトで呼び出されます。あなたの場合、メンバー関数はoperator()です。

つまり、それらはまったく異なるコンテキストで呼び出されます。あいまいさや混乱はありません。

于 2013-03-03T04:14:55.890 に答える
1

クラスのインスタンスが作成されるたびに、コンストラクターメソッドが呼び出されます。コンパイラは確かにその名前でコンストラクタを決定できます。したがって、最初に呼び出され、operator ()2番目に呼び出されます。

于 2013-03-03T04:14:12.057 に答える
1

C++ には文法があり、型がインスタンス化される時期をコンパイラが知ることができるため (大幅な簡略化) ()、クラスのインスタンスでオーバーロードされた演算子が呼び出された場合にコンストラクターを呼び出す必要があります。

これを決定するために文法がどのように使用されるかには、おそらくドラゴンブックがおそらく標準であるコンパイラのコースが必要です。興味がある場合は、C++ コンパイラの構築を目標とするC++ Grandmaster Certificationも確認してください。

于 2013-03-03T04:24:19.340 に答える