static关键字在C/C++的作用:
1.将变量声明为静态变量:
静态变量会存储在程序的数据段中,也就是说不会在栈中分配,它的生命周期是全局的。
如果是局部静态变量,它的生命周期也是全局的并且只被初始化一次,但是作用域就仅仅是在定义的函数体中。
例子:
#include <stdio.h>
int count = 100;
void func()
{
static int count = 10;
printf("%d\n", count--);
}
int main()
{
int i = 0;
for(; i < 10; i++)
{
func();
}
printf("%d\n", count);
return 0;
}
输出结果:
10
9
8
7
6
5
4
3
2
1
100
这里再提一点,由于声明了static,变量是被存储在数据区中,都会被默认初始化成0。
2.C++中的static:
1).类的静态成员函数是属于整个类的而非某个对象,并且它没有this指针。由此引申出,它不能访问非静态数据和非静态成员函数,以及不能被声明为virtual、const、volatile。这几点需要对C++的内存模型有一定的理解才能明白。
2).类的静态数据成员同样是属于类的,对象都可以进行访问。初始化需要在类外进行。初始化格式:<数据类型><类名>::<静态数据成员名>=<值>。
3).对一个静态成员函数取地址,获得的是内存中的位置并且类型是一个非成员函数指针。
例子:
#include <iostream>
using namespace std;
class Test
{
public:
Test(int _x, int _y):x(_x), y(_y){};
~Test(){};
static void static_func();
void show();
private:
int x, y;
static int z;
};
void Test::static_func()
{
cout << "I'm static function " << endl;
/* show(); 这里如果调用show()会报错
因为其实一个普通的成员函数传参数时都会传入this指针,调用其它成员函数时就变成了this->func()。由于静态成员函数没有this指针,这一功能当然就无法实现了,也不能访问静态成员变量同理。
不能声明为virtual也是因为调用虚函数传参时传入了this指针。
不能声明为const也是因为没有this指针,在C++中const用于表示函数不能修改成员变量的值,静态成员函数连this指针都没有,当然不能实现了。
*/
}
void Test::show()
{
cout << x << y << z << endl;
}
//从这里可以看出,类中声明的访问控制并不妨碍静态成员变量的初始化。但是在访问时是会受限的。
int Test::z = 3;
int main()
{
Test t(1, 2);
t.show();
Test::static_func();//静态成员函数的调用是直接由类调用
//cout << Test::z; 会报错,因为z是private的。
return 0;
}
3.这一点其实是static最重要的一点。即它可以隐藏变量和函数。
在一个源文件中把函数/变量声明为了static之后,其它源文件是访问不到的。
a.c:
int num = 3;
void test()
{
printf("I'm a's function\n");
}
b.c:
#include <stdio.h>
extern int num;
int main()
{
printf("%d\n", num);
test();
}
然后编译一下gcc a.c b.c -o test
。
运行结果:
3
I's a's function
但是当我们给test函数和变量num加上static
关键字,发现编译过不了了,提示对test
和num
未定义的引用。
利用这一特点,我们可以在不同的文件中定义相同名字的变量和函数而不必担心命名冲突。这在多个模块开发时是很有用处的。