0

问题是,什么是最好的或更好的做法。假设我有一个函数,它属于某个类,这个函数需要使用一些静态变量。有两种可能的方法 - 将此变量声明为类的成员:

class SomeClass
{
public:
    ....
    void someMethod();
private:
    static int m_someVar;
};

SomeClass::someMethod()
{
    // Do some things here
    ....
    ++m_someVar;
}

或者在函数内部声明它。

class SomeClass
{
public:
    ....
    void someMethod();
};

SomeClass::someMethod()
{
    static int var = 0;
    ++m_someVar;
    // Do some things here
    ....
}

我可以看到第二种变体的一些优势。它提供了更好的封装并更好地隔离了实现的细节。所以在其他类中使用这个函数可能会更容易。如果这个变量只能由单个函数修改,那么它可以防止其他方法导致一些错误的数据损坏。

虽然很明显,当您需要在多个方法(类函数)之间共享静态变量时,第一个变体是唯一使用的变体,但问题与静态变量应仅用于单个函数的情况有关。在这种情况下,第一个变体有什么优势吗?我只能考虑一些与多线程相关的东西......

4

3 回答 3

1

这很简单 -static如果逻辑上属于类(有点像),则使用成员,如果逻辑上属于函数( ),则instanceCounter使用本地成员。staticnumberOfTimesThisMethodWasCalled

于 2012-10-10T10:25:04.883 回答
1

选择static与否完全取决于上下文。如果一个特定的变量需要在一个类的所有实例中是通用的,你就让它static.

但是,如果一个变量只需要在函数中可见并且需要在函数的每次调用中都是通用的,那么只需将其设为局部static变量即可。

于 2012-10-10T10:25:47.297 回答
1

函数中静态数据成员和静态变量的区别在于,第一次在启动时初始化,第二次在函数第一次被调用时(惰性初始化)。

当在多线程应用程序中使用函数时,延迟初始化可能会产生问题,如果设计不需要它,我更喜欢使用静态成员。

于 2012-10-10T10:26:15.807 回答