静态成员函数主要为了调用方便,不需要生成对象就能调用。
比如:
class X
{
public:
void MethodA();
static void MethodB();
}
这时候就可以直接调用了,X::();
调用前必须生成一个类对象,X x; X。();
当函数的行为在所有派生类中保持一致时,可以将函数声明为静态。
静态成员函数基本上做同样的事情:具有命名空间的全局函数。
例如,如果一个数学类定义了一些函数,它可以声明伪静态Math.sin(x)等。
好处有很多,但所有的好处都是基于:它与类的实例无关,只与类有关,并且不需要this指针。
至于可重入问题,还有非静态成员函数。 为什么只问静态函数的可重入性。
例如:
(1) 可以实现某些特殊的设计模式:例如;
(2)由于没有this指针,所以可以将一些系统API回调函数以静态函数的形式封装在类内部。 因为系统API的回调函数通常都是没有this指针的非成员函数(隔离函数)。 例如,您可以在类内部编写线程函数来创建线程。 如果没有静态函数,那么这个回调函数必须定义为全局函数(非静态成员函数指针无法转换为全局函数指针),从而影响OO“封装性”。
(3) 可以封装某些算法,比如数学函数,比如ln、sin、tan等,这些函数不一定属于任何对象,所以感觉从类中调用比较好,比如定义一个数学函数函数类Math,调用Math::sin(3.14); 如果必须使用非静态函数,则必须: Math math; 数学.sin(3.14);
没关系,但我只是不高兴:只是为了一个根本没有状态存储的数学函数,它必须引入对象构造和对象销毁,我当然不高兴。 而现在有了对象,就得仔细定义复制构造函数、复制赋值运算符等,这对于一些纯粹算法的东西来说显然是不合适的。
(4)简而言之,从OOA/OOD的角度来看,所有无需实例化即可具有某种行为的函数都应该设计为静态的。
以上只是一些基本的考虑,并不绝对。 只有一件事是绝对正确的:“静态函数无需实例化即可调用,非静态成员不会也不能被调用或操作。” 考虑到这一点,就可以更容易地决定何时需要它以及何时适合在实际编程中使用它。