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

Use member variable or static variable in C++?

本文关键字:变量 静态 成员 C++      更新时间:2023-10-16

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

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;
}

我想知道你更喜欢用哪一种。不涉及比赛条件。

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

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

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

void Foo::foo()
{
    static int i = 0;
    std::cout << ++i;
}
// ...
Foo foo, foo2;
foo.foo();  // i = 1
foo2.foo(); // i = 2

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

当您想在没有类实例的情况下访问静态变量或在多个实例之间共享它时,可以使用静态变量。当您希望每个类实例都有自己的变量副本时,可以使用成员变量。

希望这能有所帮助。

如果在类内声明实例变量,则会产生以下效果:

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

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

  • 您可以在使用变量的位置对其进行初始化
  • 类中没有其他方法可以访问/更改该值
  • 在类的所有实例化中都有一个共享值

这些显然是由编译器以不同的方式实现的,但除非您能够用探查器表明这是性能的瓶颈,否则您不应该担心这一点。相反,要担心你的预期行为以及你真正想要的情况。