static:
在C中我们知道,static作为一个关键字,既能修饰变量,也能修饰函数
1.修饰变量
若修饰局部变量,会改变他的生命周期,出了它现在所处的作用域,也不会被销毁,因为此时它已经不是存储在栈上,而是存在数据段上,数据段上的内容只有进程结束才会被销毁,但它的作用域不会被改变,还是处于当前作用域,该作用域之外不可见。
注意:
由于static局部变量的特性,使得含有静态局部变量的函数变得不可重入,每次调用会产生不同的结果,在多线程编程中是一种隐患,使用的话多加小心。若修饰全局变量,它也是存储在数据段上,生命周期和作用域未改变,有所改变的是其链接属性,全局变量原本是有默认的外部链接属性的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern 全局变量名的声明,就可以使用全局变量。加上static关键字后,只在定义它的源文件有效,在其他文件无法访问。
static int g_a=0;//被初始化的静态全局变量系统会为其分配真正的空间
static int g_b;//未被初始化的静态全局变量系统不会为其分配真正的空间
2.修饰函数
和修饰全局变量类似,只改变其链接属性。因此在不同的源文件我们可以使用同名的函数。
C++中:
主要说明static在类中的使用
很多情况下我们会将类中的成员声明为静态的,关于以下几点需要注意:
- 静态成员在类中只有一份,被所有类对象共享,不属于某个具体的对象。
- 静态成员变量需要在类中声明,在类外定义,定义时不用加static关键字。
- 因为静态成员不是某个对象私有的,因此在访问时通过类域进行访问。(其实也可以通过对象来访问,只是在编译器在编译时都会转换成类域访问)
- 若未定义类对象,我们是不能访问非静态成员函数的,但可访问静态成员函数
静态成员函数和非静态成员函数的本质区别就是前者没有默认的this指针,而后者有。所以:
在静态成员函数内部不能使用非静态成员(包括非静态成员变量和非静态成员函数),但在非静态成员函数中可以使用静态的成员变量。静态成员优先于对象存在,静态成员随类的加载就已经存在了
- 在计算类大小时,不用将静态成员变量大小计算进去。
- 和普通成员函数一样,静态成员也有三种访问级别private、protected、public。
静态成员与非静态成员的区别:
1.存储位置不同
静态成员存在数据区,属于该类的共享数据
非静态成员存在类对象的内存中,属于该对象的私有数据
2.生命周期不同
静态成员的生命周期随该类的加载
非静态成员的生命周期随该类的类对象
3.调用方式不同
静态成员可通过类名或类对象调用
非静态成员只能通过类对象调用
将类成员声明成静态还是非静态的应该看具体使用的场景,若我们要在成员函数中访问非静态成员就得声明成非静态的,要是不访问就能声明称静态的。