在C ++中使用成员变量或静态变量?

时间:2014-08-25 05:37:50

标签: c++

我有一个仅在一个函数中使用的变量。变量应该在函数调用之间保持其值,因此它应该是静态变量。有两种方法可以实现它。一种是将其声明为成员变量:

class A{
private:
   void foo();
   int i;
}
// i is initialized to 0 in constructor
void A::foo()
{
    i++;
    if (i > 5)
        i = 0;
}

另一种是在函数内声明一个静态变量:

void A::foo()
{
    static int i;
    i++;
    if (i > 5)
        i = 0;
}

我想知道哪一个更适合使用。没有竞赛条件。

4 个答案:

答案 0 :(得分:3)

我在问题中看到了一个误解:第一个没有声明变量static。只有第二个。在第一个变量中,变量是一个实例变量,即类的不同实例将有自己的变量,但在第二种情况下,它(通常称为)一个类变量,这意味着它被共享所有实例。在您提出任何进一步的问题之前,您必须先了解这种差异。

关于哪一个更好,取决于你想要如何/为什么要使用它,这在你的问题中是不明确的。还不清楚为什么要使用类和非静态成员函数。

答案 1 :(得分:2)

在成员函数内创建静态变量时,该类的所有实例共享同一个变量。例如:

void Foo::foo()
{
    static int i = 0;
    std::cout << ++i;
}

// ...
Foo foo, foo2;
foo.foo();  // i = 1
foo2.foo(); // i = 2

但是,没有静态关键字的数据成员对于每个类的实例都是不同的变量。因此,如果您不介意共享同一变量的实例,请使用第二个示例,否则,请使用第一个。

答案 2 :(得分:1)

如果要在没有类实例的情况下访问静态变量或在多个实例之间共享静态变量,则使用静态变量。如果希望每个类实例都拥有自己的变量副本,则使用成员变量。

希望这有帮助。

答案 3 :(得分:0)

如果在类中声明实例变量,则会产生以下影响:

  • 您必须在构造函数中初始化变量。
  • 班级中的任何方法都可以访问和更改该变量。
  • 如果您实例化多个类变量,它们都将具有 i 的单独副本。

如果在成员函数中使用 static 变量,则:

  • 您可以将变量初始化为正确使用的位置。
  • 班级中没有其他方法可以访问/更改值。
  • 该类的所有实例都有一个共享值。

这些显然是由编译器实现的,但除非您可以向分析器显示这是性能瓶颈,否则您不应该担心这一点。而是担心你的预期行为和你真正想要的情况。