1.静态变量:是由静态修饰符static来修饰的,是类的变量,但是不属于任何一个类的具体对象,也就是说,也就是说,对于该类的任何一个具体的对象来说,静态变量是一个公共的存储单元,任何一个类的对象在访问这个存储单元时,都会获得一个同样的数值,同样,任何一个类在修改这个存储单元时,也都会完成相同的操作。这样我们就可以理解成对象共享了静态变量。
2.静态方法也是由static修饰符来修饰的,静态方法是属于整个类的方法:
首先,调用静态方法时,应该是使用类名做前缀进行调用,而不是用 类名 c=new 类名();创建对象名来调用,因为静态方法属于整个类的方法。
其次,非静态的方法属于某个对象的方法,是在这个对象在被创建时,系统为对象的方法在内存中分配单独的专用空间;而静态的方法则是属于整个内的方法,它随着类的定义而在内存中进行分配,不属于任何一个对象。
最后,静态方法属于整个类的,因此它不能对某个对象的成员进行操作和处理,而只能对某个类的成员变量进行操作和处理,也就是说,静态方法只能处理静态数据。
静态方法中没有this引用,不能在静态方法中访问非静态的成员和方法;
在同一个类中,静态的方法不能调用非静态的方法,但是在非静态方法中能调用静态的方法;
3.使用static成员而不是全局对象有优点如下:
1. static成员的名字是在类的作用域中,因此可以避免与其他类的成员或全局对象名字冲突
2. 可以实施封装。static成员可以是私有成员,而全局对象不可以。
3. static成员是与特定类关联,并不与该类的对象相关联。程序代码意图清晰
4.静态全局变量与全局变量区别
静态全局成员:全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量;
存储方式:全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。因为全局/静态区内存中存储区都指向的是一个地方,所以存储方式、所在存储区没有区别。
作用域:
非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。
例如 如果在A1.cpp定义个全局变量 int nExtern = 55;
那么在A2.cpp中 虽然没有include A1 但是 只要 extern nExtern; 后就可以使用这个全局变量了。
而静态全局变量 只能在 include它所在类的 头文件后,才能使用 CTest1::sNum。 (该例子有歧义待完善)
局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。
全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。
extern全局变量、static全局变量和static局部变量的生存期都是“永久”,区别只是可见域不同。
extern全局变量可见区域是工程,static全局变量可见区域是文件,//而static局部变量的可见区域是块。
MFC中:
在.h的class中定义static int snNum 一个静态局部变量, 必须在.cpp中所有函数外部进行初始化后方可使用。