繁体   English   中英

成员函数与静态函数(带对象引用)

[英]Member functions vs static functions with object reference

可以将静态函数传递给对象的引用时,为什么要使用成员函数?

例如:

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

这不只是一种风格上的东西吗? 我的理解是,成员函数是按对象实例创建的,而静态函数不是-并且由于您可以像上面的示例一样使静态函数按实例运行,因此创建静态函数的效率不应该稍微提高一点吗?成员函数?

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();

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

这很重要,因为它允许多态 特别是因为它是动态调度所必需的,因此在运行时,将调用绑定到的方法由调用它的对象的真实类型确定。 无论对象本身的运行时类型如何,静态调用始终将其绑定到指定类型的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM