0

静的関数にオブジェクトへの参照を渡すことができるのに、なぜメンバー関数を使用するのですか?

例えば:

#include <iostream>

class Widget{
private:
    int foo;
public:
    Widget(){
        foo = 0;
    }
    static void increment( Widget &w ){
        w.foo++;
        std::cout << w.foo << std::endl;
    }
};

class Gadget{
private:
    int foo;
public:
    Gadget(){
        foo = 0;
    }
    void increment(){
        foo++;
        std::cout << foo << std::endl;
    }
};


int main(int argc, const char * argv[]){

    Widget *w = new Widget();
    Widget::increment( *w );

    Gadget *g = new Gadget();
    g->increment();

    return 0;
}

これは文体的なもの以上のものですか?私の理解では、メンバー関数はオブジェクトインスタンスごとに作成されますが、静的関数は作成されません。上記の例のように静的関数をインスタンスごとに動作させることができるため、代わりに静的関数を作成する方が少し効率的ではありません。メンバー関数の?

4

2 に答える 2

2

Memeber関数はインスタンスによって作成されません。それらはthisポインタである暗黙の最初のパラメータを持っているので、実際には静的関数に非常によく似ています。

例えば、

struct Foo {
  void foo(int i) {}
}

Foo f;
f.foo(42);
Foo::foo(f, 42);

最後の2行も同じです。ただし、静的メソッドまたは関数を使用してこれを実装する方法を理解するのは困難です。

struct IFoo {
  virtual foo() const {}
};

struct Foo1 : virtual public IFoo {
  virtual foo() const {}
};

IFoo* f = new Foo1;
f->foo();

したがって、演算子を使用してインスタンスのメソッドを呼び出すことができるという構文上の糖衣に加えて、.この種の実行時ポリモーフィズムにはメソッドが必要です。

于 2012-08-12T21:31:16.580 に答える
2

それはポリモーフィズムを可能にするので重要です; 特に、動的ディスパッチに必要なためです。この場合、呼び出しをバインドするメソッドは、実行時に、呼び出されるオブジェクトの実際のタイプによって決定されます。静的呼び出しは、オブジェクト自体の実行時タイプに関係なく、常に指定されたタイプのメソッドにバインドされます。

于 2012-08-12T21:36:26.620 に答える