成员函数中的static var

时间:2011-02-12 09:18:45

标签: c++ static member-functions

bool SomeClass::Function( bool thankYou = true )
{

    static bool justAbool = false;
    // Do something with justAbool;
    ...
}

我已经四处寻找但除了全局变量或成员函数本身之外我找不到任何相关内容。

上面做了什么,即发生了什么,justAbool在离开范围后保持其价值?或者它重新进入范围时是否“记住”该值?

6 个答案:

答案 0 :(得分:21)

变量justAbool仅初始化为false一次,并在输入函数之前初始化。离开函数范围后,将记住该值。值得注意的是,SomeClass 的所有实例都将分享该值,就像静态成员变量一样。如果您创建类的新实例然后再次调用该函数,则不会重新初始化变量justAbool

答案 1 :(得分:13)

当应用于局部变量时,

static会给出该变量静态存储持续时间。这意味着justAbool的生命周期持续到程序的末尾,而不是函数调用的结束。它的范围保持不变,只有在声明出现后才能通过函数中的名称访问它。

第一次调用函数时,

justAbool将被初始化(使用提供的初始值设定项= false)。此后它将保留其先前的值,再次调用该函数时不会重新初始化。

以下是有关存储持续时间和使用寿命的更详细信息,并参考了标准。

如果对象具有静态存储持续时间,则意味着对象的存储持续到程序的持续时间(从开始到结束)。 (3.7.1 [basic.stc.static])

由于bool是一种没有非平凡构造函数的类型,它的生命周期反映了它的存储,即它从程序的开头到结尾。 (3.8 [basic.life])

具有静态存储持续时间(包括本地对象)的所有对象在任何其他初始化之前都是零初始化的。 (6.7 / 4 [stmt.decl])[对于带有初始化程序的本地对象,这是相当学术性的,因为在达到声明之前无法读取它们的值。]

常量表达式初始化的静态存储持续时间的POD类型的本地对象在其输入块之前被初始化,否则静态存储持续时间<的本地对象<当控件通过其声明时,/ em>被初始化。 (再次6.7 / 4)

实现是许可者,但不是必需的,在某些情况下执行早期初始化。

答案 2 :(得分:1)

上述功能可以完成评论// Do something with justAbool;中的功能。

严肃地说,是的,函数中的static变量(在本例中为justAbool)即使在从函数返回后仍保留它的值。它只会被初始化。并且每次连续调用都使用它,就像它是全局变量一样。 它的生命周期等于程序的结束。

int f()
{
   static int v = 0;
   return ++v;
}
int main()
{
   cout << f() << endl;
   cout << f() << endl;
   cout << f() << endl;
   cout << f() << endl;
}

输出:

1
2
3
4

在线演示:http://www.ideone.com/rvgB5

答案 3 :(得分:0)

justAbool实际上是一个常规静态变量 - 它从程序的开头就存在,只初始化一次。特殊的是只有在这个函数中才知道 - 如果你尝试在函数之外使用它,编译器就不会知道它是什么。

答案 4 :(得分:0)

justAbool在离开范围后保持其价值。你还希望这段代码做什么呢?

答案 5 :(得分:0)

函数级静态局部变量,初始化取决于变量类型:

  • POD:在main()
  • 之前初始化
  • 非POD:第一次初始化,执行函数中的行。