1. 面向过程(C)
本部分将从**全局变量**,**局部变量**,**函数**三方面讨论static关键字的作用。
1.1 静态全局变量
在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。
1.1.1 静态全局变量与全局变量的共性
1.存储空间相同:变量都在全局数据区分配内存
1.1.2 静态全局变量与全局变量的异性
1.作用域不同:静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;而全局变量默认有外部链接性,作用
域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern全局变量名的声明,就可以使用全局变量了。
1.2 静态局部变量
在局部变量前,加上关键字static,该变量就被定义成为一个静态局部变量
1.2.1 静态局部变量与局部变量的共性
1.作用域相同:作用域都是局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。
1.2.2 静态局部变量与局部变量的异性
1.存储空间不同:静态局部变量是在全局数据区分配内存;局部变量是在栈区分配内存的。
2.生命周期不同:因为静态局部变量始终驻留在全局数据区,所以生命周期知道程序运行结束;而局部变量因为在栈区分配内
存,所以定义在函数体内的局部变量会随着程序退出函数体而失效。
1.3 静态函数
在函数的返回类型前加上static关键字,函数即被定义为静态函数。
1.3.1 静态函数与普通函数的共性
1.大家都有函数该有的功能~.~
1.3.2 静态函数与普通函数的异性
1.作用域不同:静态函数只能在声明它的文件当中可见,不能被其他文件使用。(用法同静态全局变量一样)
2. 面向对象(C++)
本部分将从类的**数据成员**和**成员函数**两方面讨论static关键字的作用。
2.1 静态数据成员
在类的数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员。
2.1.1 静态数据成员和普通数据成员的共性
1.访问规则相同:静态数据成员和普通数据成员一样遵从public,protected,private访问规则。
2.1.2 静态数据成员和普通数据成员的异性
1.存储空间不同:静态数据成员存储在全局数据区,在定义时就要分配空间;而普通数据成员在类被实例化时才会分配空间,并
且随着类的销毁而销毁。
2.定义方式不同:静态数据成员在类外定义,普通数据成员在类内定义。(原因结合一下存储空间)
3.内存分配次数不同:静态数据成员只分配一次内存,供所有对象访问;普通数据成员每个类的对象都有自己的拷贝。(原因可
以在结合一下存储空间)
4.作用域不同:静态数据成员服务于整个类的对象,普通数据成员之服务于实例化它的对象。
5.访问方式不同:静态数据成员可以被所有对象访问,并且在没有产生类对象时就可以被访问;而普通数据成员只能被实例化
它的对象访问。
2.2 静态成员函数
定义方式与面向过程的静态函数相同。
2.2.1 静态成员函数和普通成员函数的共性
1.定义方式相同:由于静态成员函数在定义时不能指定关键字static,所以在定义是看不出来静态成员函数和普通成员函数,
但从声明上可以看出来!
2.2.2 静态成员函数和普通成员函数的异性
1.访问权限不同:非静态成员函数可以任意地访问静态成员函数和静态数据成员;静态成员函数不能访问非静态成员函数和非静
态数据成员,但静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数。
2.运行速度不同:普通成员函数一般都隐含了一个this指针,this指针指向类的对象本,而静态成员函数由于不是与任何的对
象相联系,因此它不具有this指针。由于没有this指针的额外开销,因此静态成员函数与类的普通成员函数相比速度上会有少
许的增长。
3.访问方式不同:普通成员函数只能通过对象访问;而静态成员函数不仅可以通过对象访问,也可以通过类访问。
3. 总结
虽然本文从头到尾一直谈论的是在C/C++中添加static与不添加static的异同点,并没有显示说明说明它们的作用和它们
的使用技巧和方法。例如在面向过程中,我们只谈论了静态全局变量和全局变量区别在于作用域不同,静态全局变量只能作用声
明它的文件。但作用域的不同,使得我们不用担心在该文件下定义的静态全局变量会被其他文件修改,也不用担心在其他文件下
定义相同的变量名引发冲突。
通过上面的例子我希望阅读本文的同学可以不只知其然,还可以知其所以然。感谢您的阅读,有任何意见或者建议希望大家
可以留言交流,谢谢。