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

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

我已经四处搜索,但除了全局变量或成员函数本身之外,我找不到任何关于此的内容。

以上是做什么的,即发生了什么,justAbool在离开作用域后是否保持其价值?或者当它重新进入作用域时它是否“记住”了这个值?

4

6 回答 6

27

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

于 2014-12-04T16:51:57.607 回答
12

static当应用于局部变量时,会给出该变量的静态存储持续时间。这意味着justAbool的生命周期持续到程序结束而不是函数调用结束。它的作用域保持不变,它只能在函数中通过名称访问,在声明出现之后。

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

以下是有关存储持续时间和生命周期的一些更完整的详细信息,并参考了标准。

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

由于 abool是一个没有重要构造函数的类型,它的生命周期反映了它的存储生命周期,即它从程序的开始到结束都存在。(3.8 [basic.life])

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

使用常量表达式初始化的具有静态存储持续时间的 POD 类型的本地对象在进入其块之前被初始化,否则具有静态存储持续时间的本地对象在控制通过其声明时被初始化。(再次 6.7/4)

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

于 2011-02-12T09:26:34.000 回答
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

于 2011-02-12T09:22:19.247 回答
0

justAbool实际上是一个常规的静态变量——它从程序开始就存在并且只初始化一次。特殊之处在于仅在此函数中知道-如果您尝试在函数之外使用它,编译器将不知道它是什么。

于 2011-02-12T09:22:27.347 回答
0

justAbool 离开作用域后保持其值。你还想让这段代码做什么?

于 2011-02-12T09:24:45.493 回答
0

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

  • POD:在 main() 之前初始化
  • non-POD:第一次初始化,函数中的行被执行。
于 2015-07-22T13:23:23.027 回答