当我可以将对对象的引用传递给静态函数时,为什么还要使用成员函数?
例如:
#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/