c++ - 成员函数与具有对象引用的静态函数

标签 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;
}

这不仅仅是一种风格上的东西吗?我的理解是,成员函数是按对象实例创建的,而静态函数不是——而且由于您可以使静态函数像上面的示例一样在每个实例的基础上运行,创建静态函数不是更有效吗?成员函数?

最佳答案

成员函数不是由实例创建的。它们有一个隐含的第一个参数,即 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();

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

关于c++ - 成员函数与具有对象引用的静态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11926024/

相关文章:

c++ - 从 std::stringstream 中提取整个 std::string

c# - 使用 CryptDecrypt 解密 RijndaelManaged 加密字符串

c++ - 套接字上的并行读/写

c - 为什么GCC初始化为0时不分配静态变量

Java 从我创建的另一个类访问数组元素

php - 继承子类中的静态属性而不需要重新声明?

c++ - MSVC 函数分解

php - PHP 中的 MySQL;比较前编辑列值

php - 如果未设置变量,则使用函数初始化变量 - PHP

c++ - 在 int main() [c++] 中实现递归函数