成员函数静态变量vs成员变量

时间:2014-03-03 21:17:07

标签: c++ static

在成员函数中使用静态变量而不是成员变量是否应该在函数调用之间保留其值的变量是一个好习惯吗?

考虑以下示例:我有一个具有update()函数的类,其中每个帧都会旋转一些3D对象。我有时会看到以下代码:

void Class::update(float frameTime)
{
    static float rotation = 0.0f;
    rotation + = m_rotationSpeed * frameTime
    if (rotation >= 360.0f) rotation -= 360.0f;
    // ...
}

这也可以使用成员变量来实现。

是否有任何理由更喜欢一种实施而不是另一种实施?在我看来,使用像这样的静态确实可以改善封装并且还可以产生更小的对象,但另一方面它似乎有点不太直观。

请注意,类似的类通常用于单个实例,并且,从C ++ 11开始,静态变量应该是线程安全的。

5 个答案:

答案 0 :(得分:4)

在此处使用static变量毫无意义,因为 Class的所有实例将访问同一个变量。您不太可能需要在这样的实例之间共享rotation

如果要将类限制为单个实例,则必须确保它只能实例化一次。但这通常表明重新设计是有序的。

答案 1 :(得分:0)

我会说如果你使用单例方法,那么使用静态字段就没有意义了。即使你的项目不会变得更大。

答案 2 :(得分:0)

通常使用静态。静态意味着您可以在不声明对象的情况下使用它。静态不适合您的情况。仅仅因为它只有一个并不意味着它需要是静态的。

静态非常有用,通常情况下,如果您希望能够在没有对象的两个实例的情况下进行比较,那么静态非常有用。

也许你有一个形状对象,它有一个颜色的枚举。通过使枚举静态,您可以执行诸如if(myShape.shapeColor == Shape::color::red)之类的操作。但是,我通常会远离静态。这是其中一个有其用途的东西,不需要进一步扩展。

编辑:

实际上,在这种情况下使枚举静态不会改变任何东西。我想我会尽量保持我的答案有点有效,所以我假装在这种情况下你不能使用枚举。 (尽管这是一个c ++问题,但我只是提出了一个观点)。你可以声明一系列常量静态整数。您不会被迫拥有两个对象进行比较。

答案 3 :(得分:-1)

对于小型应用程序来说,使用静态这样就可以了,但是随着应用程序变得越来越大,那么因为使用静态而导致使用静态的问题,因此使用静态会导致使用静态的问题。

答案 4 :(得分:-1)

这里没有“好的实践”,因为他们没有做同样的事情:

  • 成员变量(属性)将仅由该类的当前实例更新。
  • 该类的所有实例都将修改静态变量。

例如班级

class Foo
{
 void bar() 
 {
  static int bar = 0;

  std::cout << bar << std::endl;
  bar++;
 }
};

给出了这个主要的

int main() 
{
 Foo one, two;

 one.bar();
 two.bar();
 two.bar();
 one.bar();
}

将输出

1
2
3
4