C++ static关键字再理解

问题来源

在复习单例模式的时候,我看到了网课上给的以下示例代码:

1
2
3
4
5
6
7
8
9
class A {
static A& getInstance();
...
};

A& A::getInstance() {
static A a;
return a;
}

我不明白为什么反复调用getInstance()并不会创建新的A的对象,返回的一直是第一次调用时创建的a;

解答

通过查阅资料得知了:

在函数内声明的static局部变量的生存期也是整个源程序,但其作用域任然和局部变量相同,只是在函数内部可见,退出函数后,尽管变量存在,但是不能使用,下次调用函数的时候,这个局部变量不会再初始化。

用一个例子来解释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
using namespace std;

int func() {
static int count = 0;
return count++;
}

int main() {
for(int i = 0; i < 10; i++) {
cout << i << " times " << func() << endl;
}
return 0;
}

/* output :
0 times 0
1 times 1
2 times 2
3 times 3
4 times 4
5 times 5
6 times 6
7 times 7
8 times 8
9 times 9
*/

因为在局部变量countstatic的,它的生命期是整个程序,并且只会在第一次调用func的时候初始化。