static第一个作用:限制变量或函数作用域
当我们在全局变量或者函数前面不加static时,那我们的全局变量或者函数是外可见的,不同的文件之间是可以互相访问的。但是当我们加上static关键字以后不同文件之间我们的函数和全局变量是隐藏的。这样做的好处是:可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏.
static第二个作用:保持变量的持久
一般我们的局部变量是存储在栈上,当函数结束,变量也随之结束被释放。而静态局部变量和全局变量一样存储于进程的全局数据区,虽然函数结束后他无法被使用,但即使函数返回,它的值也会保持不变。他跟全局变量相比因为位于函数内,更加便于维护。注意:存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。
1 #include <stdio.h> 2 //因为C++的函数如果main要调用要写在前面或者需要在main里面申明 3 void func_one() 4 { 5 int ex = 5; 6 printf("func_one_ex = %d ",ex); 7 ex++; 8 printf("func_one_ex++ = %d ",ex); 9 } 10 11 void func_two() 12 { 13 static int ex = 5; 14 printf("func_two_ex = %d ",ex); 15 ex++; 16 printf("func_two_ex++ = %d ",ex); 17 } 18 19 int main() 20 { 21 //第一次运行 22 func_one(); 23 func_two(); 24 //第二次运行 25 func_one(); 26 func_two(); 27 }
1 func_one_ex = 5 2 3 func_one_ex++ = 6 4 5 func_two_ex = 5 6 7 func_two_ex++ = 6 8 9 10 11 func_one_ex = 5 12 13 func_one_ex++ = 6 14 15 func_two_ex = 6 16 17 func_two_ex++ = 7
通过上面的代码我们看到两个函数第一次运行的时候ex都被初始化了,但第二次运行的static的变量并没有被初始化且保持了原来的值。
类成员声明static
1、静态成员函数没有this指针,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数;非静态成员函数可以任意地访问静态成员函数和静态数据成员;
2、由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;
3、调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以直接使用如下格式<类名>::<静态成员函数名>调用类的静态成员函数。