从三个方面来讲述static的用法和作用,分别是静态局部变量和静态函数以及静态成员
1.
在一个函数中定义静态局部变量的时候,该静态局部变量的生命周期将贯穿整个程序的运行期,而不会像局部变量一样函数运行结束的时候就被销毁。
#include <iostream>using namespace std;
void count()
{static int cnt = 0;cout << ++cnt << endl;
}int main(void)
{count();count();count();count();return 0;
}
可见,当count函数运行结束的时候,静态局部变量不会像局部变量一样消失,而是一直存在,直到程序运行结束。
其原因是,静态变量和全局变量都是存储在静态存储区(程序的数据段),而非栈区,局部变量存储在栈上,当函数调用结束时,栈上的内存将会被自动清理,所以局部变量会被消除。
2)用static定义静态函数的时候,该函数只有在当前文件是可以见,其他的文件是不可见的,哪怕你使用了extern。
举个例子,我们在test.cpp文件里面进行了两个函数的定义,一个是静态函数,一个是非静态函数
然后我们在main.cpp文件中调用这两个函数。
则有:
在test.cpp文件
#include <iostream>static void fun() {std::cout << "This is a static function in file1.cpp." << std::endl;
}void non_static_fun() {std::cout << "This is a non-static function in file1.cpp." << std::endl;fun();
}
在main.cpp文件
则有:
extern void fun(); // Error: fun() is not accessible here
extern void non_static_fun();//向外引入函数int main() {fun();non_static_fun();return 0;
}
如果我们编译这两个文件:
报错,说找不到静态函数fun的定义,所以我们说静态成员函数只有定义了它所在的文件可以调用,但是全局的函数non_static_fun是可以被调用的。
3)静态类成员
如果定义的是静态类成员,比如静态成员变量和静态成员函数。静态成员变量和静态成员函数归类所有而不是对象所有,只有一份实例,那怕没有对象也可以使用静态成员函数,且所有的对象都共用一个静态成员变量。注意静态成员函数只能访问静态成员变量和静态成员函数,非静态的无法访问。
比如说:
class Test {
public:static int count;static int getCount() {return count;}
};int Test::count = 10;//static变量要在类外面进行初始化int main() {cout << Test::getCount();//没有定义对象却可以使用静态成员函数return 0;
}