Static关键字

来源:互联网 发布:2018年国考报名数据 编辑:程序博客网 时间:2024/06/05 20:46

三个特性总结

共享

全局数据区分配内存,只会有一份拷贝。
被(多次调用的静态局部变量所在)函数共享
被(静态方法或变量所在类的所有)对象共享

隐藏

静态全局变量只能被所在文件使用
静态局部变量只能被所在函数使用
静态成员变量或函数遵从3p规则(public, protected, private)

默认值

未经初始化的静态变量会被程序自动初始化为0


面向过程(C/C++)

静态全局变量

全局变量的作用域是整个工程,在一个文件内定义的全局变量,另一个文件中可以通过extern+全局变量名的声明,来使用全局变量。为了安全和封装考虑,我们不想让本文件的全局变量可以被别的文件使用,该怎么办呢?

静态全局变量

静态全局变量的主要特性体现在隐藏(/ω\),即它的作用域是声明此变量所在的文件,其他的文件即使用extern声明也不能使用。

全局变量测试代码:

这里写图片描述

运行结果:

A

由此可以看出,全局变量是可以被其他文件用extern声明后调用。

静态全局变量测试代码:

这里写图片描述

运行结果:

B

可以看出其它文件中可以定义相同名字的变量,不会发生冲突。

静态全局变量还有以下其他特点:

该变量在全局数据区分配内存;
未经初始化的静态全局变量会被程序自动初始化为0


静态局部变量

静态局部变量的主要特性体现在共享( ̄▽ ̄)/,叫持久性更好理解。也就是它所在函数退出后,它仍然存在于内存中,直到再次调用这个函数时,使用上次调用后静态局部变量的值。

静态局部变量测试代码:

这里写图片描述

运行结果:

9 4 3 2 1 0 9

可以看出,函数内的静态局部变量a记住了上次执行过后的值,下一次执行函数时使用的是上次调用结束时的值。

函数内的局部变量a和函数外的变量a互不影响,但这不是static的功劳,去掉static也不会有error,只是不能记忆上次调用函数时局部变量a的值了。

静态局部变量还有以下其他特点:

静态局部变量在全局数据区分配内存,始终驻留在全局数据区,直到程序运行结束;

静态局部变量在程序执行到该函数的声明处时被首次初始化,以后的函数调用不再进行初始化;

静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0

其作用域为此函数内,不能在函数外调用。


静态函数

在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数的区别类似于静态全局变量和全局变量的区别。普通函数可以被别的文件以extern调用,静态函数只能被所在文件调用。


面向对象

静态数据成员

先看一段代码:


这里写图片描述

运行结果:

1 1 3 3 3

由上我们可以看出,静态数据成员主要特性是共享,类A的所有对象a1, a2**共享**同一个number。当a2将number的值改变的时候,a1的number的值也随之改变。
在类A的对象出现之前,我们就可以通过A::number来访问number。

静态数据成员特点:

静态数据成员存储在全局数据区,在程序中只有一份拷贝,该类的所有对象共享

静态数据成员定义时要分配空间,所以不能在类声明定义

静态数据成员和普通数据成员一样遵从public,protected,private访问规则。

静态数据成员不属于特定的对象,在没有产生类的实例时,我们就可以用以下方式使用它(需要是public)。
<类名>::<静态数据成员名> //C++
<类名>.<静态数据成员名> //Java

可以直接通过类名引用静态变量,也可以通过实例名来引用静态变量,但最好采用前者,因为后者容易混淆静态变量一般变量。静态变量是跟类相关联的,类的所有实例共同拥有一个静态变量。

静态数据成员初始化的格式为:
<数据类型> <类名>::<静态数据成员名>=<值>


静态成员函数


这里写图片描述

关于静态成员函数,可以总结为以下几点:

非静态成员函数可以访问静态成员函数静态数据成员

静态成员函数不能访问非静态成员函数非静态数据成员

所有这个类的对象共享,不属于任何一个对象,不能使用this关键字。

调用静态成员函数,可以直接使用如下格式:
<类名>::<静态成员函数名>(参数表)//C++
<类名>.<静态成员函数名>(参数表)//Java

也可以通过实例名来引用静态函数,但最好采用前者,因为后者容易混淆静态函数一般函数。静态函数是跟类相关联的,类的所有实例共同拥有一个静态函数。

不能将静态函数定义为虚函数。(C++)

出现在类体外的函数定义不能指定关键字static(C++)

由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;(C++)

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝上买东西错想用花呗怎么办 淘宝想用花呗买东西差一点怎么办 买了假货怎么办还用吗 免税店买完东西怎么办 淘宝恶意拍单怎么办 二手西服不想要怎么办 苹果8p费电快怎么办 赌博被骗没证据怎么办 异地车子办保险怎么办 淘宝买到旧货怎么办 苹果官网买手机发票怎么办 车子异地换牌照怎么办 汽车异地上保险怎么办 后悔买保险了怎么办 平安run不计步怎么办 天梭力洛克有划痕怎么办 天梭手按钮坏了怎么办 天梭机械表总慢怎么办 买的天梭表没电了怎么办 天猫遇见假货怎么办 苹果六s内存不足怎么办 发票丢了报销怎么办 荣耀v9玩游戏卡怎么办 无极限不退货怎么办 高中想买手机怎么办 发票搞丢了怎么办 买车发票丢失怎么办 钻戒发票丢了怎么办 电子发票税号写错了怎么办 手机分期逾期了怎么办 顾客要写三包怎么办 手机打电话串号怎么办 手机经常串号怎么办 苹果5放卡推不动怎么办 苹果插耳机外放怎么办 手机卡小卡槽大怎么办 苹果 两张手机卡怎么办 苹果6卡槽坏了怎么办 苹果卡座坏了怎么办 小米商城没发货怎么办? 小米主题显示非官方怎么办