成员函数vs带对象引用的静态函数

时间:2012-08-12 21:28:46

标签: c++ function static member

当我可以将静态函数传递给对象时,为什么我会使用成员函数?

例如:

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

这不仅仅是一种风格吗?我的理解是每个对象实例都创建了成员函数,而静态函数却没有 - 并且因为你可以像上例这样在每个实例的基础上运行静态函数,所以创建静态函数不应该稍微高效一点会员职能?

2 个答案:

答案 0 :(得分: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();

因此,除了允许您使用.运算符调用实例上的方法的语法糖之外,您需要它们来实现这种运行时多态性。

答案 1 :(得分:2)

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