这篇文章没有太多的实际内容,简单记录下static的用法。顺便试一下用markdown来写文章。
我们都知道在一个函数中的变量是存储在栈区中,函数的每一次调用都伴随着变量的重新定义和销毁。如果在变量前面加上static关键字,这个变量就会在程序的静态存储区。这个变量只会在第一次调用函数的时候定义并初始化。当再次调用函数时,会保留上次的值。例子:
1
2
3
4
5
6
7
8
9
10
11
12
13 |
int
showNum() { static
int
num = 0; return
num++; } int
main() { for ( int
i=0;i<10;i++) { cout << showNum() << endl; } return
0; } //打印0到9 |
这里面规则有点多,我直接上代码,然后比较好说明:
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
28 |
class
X{ int
i; static
int
j; public : X( int
ii = 6) : i(ii){ //非静态成员函数可以访问静态成员函数和变量 j = i; } int
val(){ return
j;} static
int
incr(){ return
++j; } static
int
f() { return
incr(); } }; int
X::j = 0; int
main() { X x; X* xp = &x; cout << x.f() << endl; cout << xp->f() << endl; cout << X::f() << endl; cout << sizeof (X) << endl; return
0; } |
有下面几个要点:
上面sizeof(X)的结果是4,说明静态成员变量j是放在静态存储区域。每个对象的成员变量都是独立的,而静态成员是所有对象共享,它没有this指针,所以静态成员函数只能访问静态成员变量。
这个translation unit我也不知道该怎么翻译,就理解为一个源文件吧。static还有一个作用就是,声明为static的变量和函数只在该文件(translation unit)有效,在其他文件中不能访问。这在大型工程中,能有效避免命名重复。
markdown写东西果然爽,不过以前中文格式看习惯了,谁能告诉我,首行缩进两个字这个需求该怎么办到。
原文:http://www.cnblogs.com/xibaohe/p/3534369.html