在C语言中,即非面向对象,与如下三点好处
1.用static修饰某个函数、变量,可以不用担心和别文件中的函数、变量重名问题。因为未加static则默认全局可见,这一功能就可以称为隐藏功能(函数唯一好处;非函数还可见2、3点)。
2.在运行过程中保持值不变。存储在静态数据区的变量只会在函数开始时初始化一次。有两种变量存储在静态数据区,一种是全局变量,另一种就是static。两者区别,全局变量全局可见、static隐藏了可见性,即该文件可见。看如下代码
#include <stdio.h> int fun(void){ static int count = 10; // 函数初始化时赋值 return count--; } int count = 1; int main(void) { printf("global\t\tlocal static\n"); for(; count <= 10; ++count) printf("%d\t\t%d\n", count, fun()); return 0; }
运行结果如下
global local static 1 10 2 9 3 8 4 7 5 6 6 5 7 4 8 3 9 2 10 1
3.自动初始化。数值类型自动初始化为0,static char *a[]初始化为一个串尾符。
#include <stdio.h> int a; int main(void) { int i; static char str[10]; printf("integer: %d; string: (begin)%s(end)", a, str); return 0; }
结果为integer: 0; string: (begin)(end)
若为面向对象,则:
1.在类中的static成员变量意味着被类的所有实例共享,即某个实例修改了改对象,则该修改对其他所有实例可见。
2.类中的static成员函数无this指针,故只能访问static成员变量。且还可以退出通过类名就可以访问成员和函数
3.指向static成员指针和指向static函数指针都是普通指针,即存放的是绝对地址。这一点同全局变量和全局函数,因为其特点差不多,但是类中的普通函数指针和普通成员指针是相对地址,即相对于这个类起始地址的偏移值,如下原因:1类的成员函数需要通过一个对象来调用
4.由于长期占有存储空间,故局部类不能定义静态数据成员,因为局部类的生存期和局部静态成员的生存期矛盾
5.union数据成员共享空间,而静态数据成员占有各自独立的存储单元。故union{static int a;static int b}错误
6.注意static修饰类的成员函数时不能与friend同时使用,因为friend是友元,而非自己的成员函数
参考:
http://blog.163.com/sunshine_linting/blog/static/4489332320119785228616/
http://zhidao.baidu.com/link?url=8D2YngLhHg2k9Ma10tJgKK4KykkJWcrjuJWx-v2xjcZvVTFn9oNr08xcJOY8_P2WoQH3sB4gBxemHJboLVw0qK