static

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、调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以直接使用如下格式<类名>::<静态成员函数名>调用类的静态成员函数。   

原文地址:https://www.cnblogs.com/xiaodangxiansheng/p/10881908.html