1.结构化设计方面:
(1)定义静态全局变量
(2)定义静态局部变量
(3)定义静态函数
2.面向对象程序设计方面:
(1)定义静态成员变量
(2)定义静态成员函数
1:首先看下在结构化程序设计中的应用,主要有三个方面的应用,定义静态全局变量,定义静态局部变量,定义静态函数。
(1)定义静态全局变量:如果把一个变量定义为静态全局变量,此变量只能在定义的文件当中使用,其他的文件当中不能用,这样的话就可以在别的文件中定义相同变量名的变量而不会造成编译错误,在比较大的工程中定义静态全局变量是非常有效的。
另外定义静态全局变量,即使不为变量赋初值,系统默认此变量的值为0(定义的非静态全局变量系统也会为此变量默认赋初值0,如果是定义在函数体内的局部变量如果不赋初值的话系统会给变量赋一个随机值)。
定义静态全局变量和非静态全局变量还有一个好处,定义的静态全局变量系统会把它放到全局变量区,而一般定义的变量会被放到栈区,全局变量区不同于栈区的一个重要的特点就是:全局变量区的数据不会随着函数执行的结束而被释放,它是会一直保存到程序结束。
注:内存的分布:
// 代码区
// 全局数据区// 栈区
// 堆区
(2)定义静态局部变量
定义的静态全局变量他不会随着函数的结束而自动被释放,因为它和静态全局变量一样被放在了全局数据区,会一直保存到程序结束。(3)定义静态函数
定义的静态函数只能在此文件当中被使用,其他的的文件不能被使用。起到了函数限定作用域的作用。
(1)定义静态成员变量。
定义静态成员函数就是在成员函数的前边加上static关键字,不能在类中定义,只能在类中声明,因为定义的时候要为其分配内存空间。静态数据成员也存在于全局数据区。
对于非静态成员函数,每个类的对象都有自己的拷贝,而静态数据成员则不同,他不属于某个具体的对象,它是所有对象所共有的,它属于类,在内存中不管定义多少个此类的对象,静态成员变量也只被拷贝一次(即分配一次内存),而非静态成员则是定义多个对象就要对此成员变量拷贝多次,这样静态成员变量就实现了内存的节约。
定义:<数据类型> <类名>::<静态数据成员>=<值>
static int _num;//声明
int base::_num=0;//静态数据成员的真正定义
静态数据成员进入程序空间当中没有名字空间,所以不会与同名的全局变量发生冲突。
(2)定义静态成员函数。
定义静态程序函数和定义静态数据成员一样,他不属于某个具体的对象,而是属于类本身的,也只能在类中声明,在类外定义。因为定义的时候要为其分配内存空间。
void M::f1(M m) {... ...}
静态成员函数还有一个优点就是他没有this指针,所以它比非静态成员函数少了许多的开销,节省了内存空间,提高了程序的执行效率。
为了避免父类的影响可以在子类当中定义一个与父类相同的静态变量,已屏蔽父类的影响。虽然静态成员是共享的,当在子类中定义一个与父类相同的静态变量不会还出错,因为编译器会加上name-mangling 用以生成唯一的标志。
静态成员不能声明为虚函数。
注:外部函数和内部函数,
内部函数:只能在本文件当中使用的函数为内部函数,只要在函数名前加上static就可以实现,但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。
外部函数:在定义函数时,如果没有加关键字“static”,或冠以关键字“extern”,表示此函数是外部函数。调用外部函数时,需要对其进行说明。