2012-08-12 148 views
0

当我可以传递静态函数对对象的引用时,为什么会使用成员函数?带有对象引用的成员函数vs静态函数

例如:

#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; 
} 

比风格的东西这个吗?我的理解是,成员函数是根据对象实例创建的,而静态函数不是 - 因为您可以像上例中那样使每个实例的静态函数运行,所以创建静态函数不应该稍微高效成员函数?

+3

你不能有虚拟的静态方法。 – 2012-08-12 21:30:22

回答

2

Memeber函数不是由实例创建的。它们有一个隐含的第一个参数,即this指针,所以它们看起来与静态函数非常相似。

例如,

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

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

的最后两行做同样的。然而,这是很难看到一个可以如何与静态方法或函数来实现这一点:

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

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

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

所以,除了让您可以致电与.操作实例方法的语法糖,你需要他们的这种运行时多态性。

+0

是的,只有局部变量是每个实例调用方法的时候。正如juanchopanza所说,*代码*不会重复。 – Tony 2012-08-12 21:33:29

2

这很重要,因为它允许polymorphism;特别是因为它需要dynamic dispatch,其中绑定调用的方法在运行时由其调用的对象的真实类型确定。无论对象本身的运行时类型如何,静态调用都会绑定到指定类型的方法。