1.首先在c中:
有一个区域叫做全局区或者静态区,又分为data区和bss区
static修饰局部变量为了使得变量具有全局性质,而修饰全局变量和函数都是为了其他的源文件不可见这个变量。
static如果修饰函数中的局部变量,那么之后这个函数每次调用这个变量时,都是使用上次函数运行完成之后该变量的结果。
跟函数外的全局变量作用有点相似,即这次函数A对这个变量进行修改,那么函数B使用的就是函数A修改过的结果,但是static局部变量跟全局变量还是不一样,static是仅仅这个函数内部可以改变它,其他函数不可见。
而staic修饰的全局变量表示这个全局变量只有这个文件可见,其他的文件都不可见。
所以,static修饰过的全局变量一般不跟extern连用。
因为一个为了使得其他源文件看不到这个变量,一个为了使得其他源文件可以引用这个全局变量。
而static修饰的函数就是为了使得其他的源文件无法使用这个函数。
2.在c++中:
如果static修饰类中的成员函数,因为成员函数本身就是属于类的,但是调用时,为了区分是哪个对象调用的,需要传入this指针。而static成员函数,可以直接通过类进行调用。
如果是static修饰的成员变量,因为成员变量本身是属于对象的,这里就变成属于类的,可以直接通过类进行调用。
(1)静态成员函数中不能调用非静态成员。
(2)非静态成员函数中可以调用静态成员。因为静态成员属于类本身,在类的对象产生之前就已经存在了,所以在非静态成员函数中是可以调用静态成员的。
(3)静态成员变量使用前必须先初始化(如int MyClass::m_nNumber = 0;),否则会在linker时出错。