C++关键字static的用法【分别修饰变量和函数、内部机制】

目录

C语言中:

1、静态局部变量

2、静态全局变量

3、静态函数

C++语言中:

1、静态成员变量

2、静态成员函数

详解:

static用来控制变量的存储方式和可见性

static的内部机制:

static的优势:


C语言中:

1、静态局部变量

静态局部变量和普通局部变量的对比:
(1)该变量在全局数据区分配内存  (局部变量在栈区分配内存);
(2)静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化(局部变量每次函数调用都会被初始化);
(3)静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0(局部变量不会被初始化);
(4)它始终驻留在全局数据区,直到程序运行结束。但其作用域不变,还是为局部作用域,也就是不能在函数体外面使用它(局部变量在栈区,在函数结束后立即释放内存);

2、静态全局变量

定义在函数体外,用于修饰全局变量,表示该变量只在本文件可见。用于文件隔离。
作用域:该文件内部, 生存期:整个程序运行期间

静态全局变量不能被其它文件所用(普通全局变量可以,需要extern);
其它文件中可以定义相同名字的变量,不会发生冲突(自然了,因为static隔离了文件,其它文件使用相同的名字的变量,也跟它没关系了);

C++关键字extern的用法:一个文件中的变量或函数在其他文件中调用

3、静态函数

静态函数的好处跟静态全局变量的好处就类似了:
1.静态函数不能被其它文件所用;(函数默认是extern的)
2.其它文件中可以定义相同名字的函数,不会发生冲突;

C++语言中:

当然以上的几种,也可以用在c++中。还有额外的两种用法:

1、静态成员变量

用于修饰 class 的数据成员,即所谓“静态成员”。这种数据成员的生存期大于 class 的对象(实体 )。静态数据成员是每个class 有一份,普通数据成员是每个对象实体有一份,因此静态数据成员也叫做类变量,而普通数据成员也叫做实例变量

2、静态成员函数

用于修饰 class 的成员函数。静态函数属于类的,不属于某一个具体的对象。访问方式,可以通过对象调用,也可以用类名::函数名进行访问。

关于静态成员变量和函数例子见链接:4.2.8 静态成员   C++核心编程【从C语言到C++】

 

static详解:

static用来控制变量的存储方式和可见性

函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现? 最容易想到的方法是定义一个全局的变量,但定义为一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅受此 函数控制)。

需要一个数据对象为整个类而非某个对象服务,同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见。

static的内部机制:

静态数据成员要在程序一开始运行时就必须存在。因为函数在程序运行中被调用,所以静态数据成员不能在任何函数内分配空间和初始化。

static被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间,静态数据成员按定义出现的先后顺序依次初始化,注意静态成员嵌套时,要保证所嵌套的成员已经初始化了。消除时的顺序是初始化的反顺序。

static的优势:

可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值