1、静态全局变量
在全局变量前面加上static,该变量就成了一个静态全局变量。静态全局变量有如下特点:
1)、变量存储在全局数据区;
2)、变量会被自动初始化为0;
3)、静态全局变量在整个编译单元(整个文件)内都是可见的,而在文件之外是不可见的。
// file1.cpp
#include <iostream>
using namespace std;
static int n = 1;
void fun2();
void fun1() {
cout << n << endl;
}
int main() {
fun1();
fun2();
return 1;
}
//view plain copy to clipboard print ?
// file2.cpp
#include <iostream>
using namespace std;
extern int n;
void fun2() {
cout << n << endl;
}
以上的代码无法通过编译。
2、静态局部变量
在函数体内定义一个局部变量,变量被存储在堆栈中,函数返回后堆栈被恢复变量就被释放了。但是静态局部变量和静态全局变量相同,都是保存在全局数据区,在没有被显式初始化的情况下也会被初始化为0,函数返回后仍然有效,函数重入后数据依然是上次的结果,这和全局变量有相同的效果,但是全局变量不只是属于函数本身,其他代码也能看到很容易破坏变量的内容,所以静态局部变量在某些需要保存函数运行状态的时候很有用。
#include <iostream>
using namespace std;
void fun() {
static int n = 1;
cout << n << endl;
n++;
}
int main() {
fun();
fun();
fun();
return 1;
}
输出为:
1
2
3
3、全局变量
声明于函数体外,生存期从声明处至程序结束,但在不同文件中用extern说明。
// file1.cpp
#include <iostream>
using namespace std;
int n = 1;
void fun2();
void fun1() {
cout << n << endl;
}
int main() {
fun1();
fun2();
return 1;
}
//view plain copy to clipboard print ?
// file2.cpp
#include <iostream>
using namespace std;
extern int n;
void fun2() {
cout << n << endl;
}
4.类的静态成员函数
类的静态成员函数与静态成员变量一样,属于类而不属于对象。一般类的成员函数都有一个隐含的this指针当做参数,这样函数就可以访问对象的成员变量,但是静态成员函数没有这个参数,所以静态成员函数不能访问对象的成员变量,而只能访问其他静态成员。下面是使用静态成员函数的例子:
#include <iostream>
using namespace std;
class A {
int n;
static int m;
public:
void fun1() {
// 一般函数可以调用静态和非静态成员,无特殊限制
cout << n + m << endl;
fun2();
}
static void fun2() {
cout << m << endl;
//错误:静态成员函数不能调用非静态成员
//cout << n << endl;
//fun1();
}
};
int main()
{ A a;
A::fun2();
a.fun1();
a.fun2();
}