c++ static 变量的使用和用途

在C语言中,关键字static的意思是静态,它有3个明显的作用:
1)在函数体内,静态变量具有记忆功能,即一个被声明为静态的变量在这一函数被调用的过程中其值维持不变。
2)在模块内,它的作用是限制变量的作用域,即如果一个变量被声明为静态的,那么该变量可以被模块内所有函数访问,但不能被模块外其他函数访问。他是一个本地的全局变量,如果一个函数被声明为静态的,那么该函数与普通函数作用域不同,其作用域仅在本文件中,它只可以被模块内的其他函数调用,不能被模块外的其他函数调用,也就是这个函数被限制在它的模块的本地范围使用。
3)内部函数应该在当前源文件中说明和定义,对于可在当前文件以及当前文件意外使用的函数,应该在一个头文件中声明,使用这下函数的源文件要包含这个头文件
具体而言,static局部变量和普通的局部变量的区别在于static全局变量值初始化一次,下一次操作的时候static变量会根据上一次得到的结果继续计算。static函数与普通函数的区别在于,static函数只能在本文件中被调用
在C++中,在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员。静态数据成员有一下特点

  1. 对于非静态数据成员,每个类都有自己的复制品。而静态数据成员被当做是类的成员。无论这个类的对象被定义多少个,静态数据成员在程序中也只是一个复制品,有该类的所有对象访问。
  2. 静态数据成员存储在全局数据区。定义时要分配空间,所以不能在类声明中定义。由于静态数据成员属于本类的所以对象共享,所以它不属于特定的类对象,在没有产生类对象时其作用域就可见,即在没有产生类的实例时,程序员也可以使用它。
  3. 静态数据成员和普通数据成员一样遵从public、private、protected访问规则。
  4. static成员变量的初始化是在类外,此时不能再带上static的关键字。private、protected的static成员虽然可以在类外初始化,但是不能在类外访问。

与全局变量相比,使用静态数据成员有一下二个优势:
(1)静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其他全局变量名字冲突的可能性。
(2)可以实现信息隐藏。静态数据成员可以是private,全局变量不能
与静态数据成员一样,当类的成员函数添加了static关键字后就变为了类的静态成员函数,静态成员函数为类的全部服务而不是为某一个类的具体对象服务。静态成员函数是累的内部实现,属于类定义的一部分。普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体的对象。通常情况下,this是任何的对象相联系,因此它不具有this指针。从这个意义上讲,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数和使用其他静态成员变量。

为什么static变量值初始化一次?
对于所以的对象,初始化都只有一次;而由于静态变量具有记忆功能,初始化后,一直没有被销毁,都会保存在内存区域中,所以不会再被初始化。
存放在静态区的变量生命周期一般比较长,一般与整个源程序同生死、共存亡,所以它只需要初始化一次。而outo变量,即自动变量,由于存放在栈区,一旦调用过程结束,就会被立刻销毁。
分析以下程序代码:

#include<stdio.h>
void funn(int i)
{
static int valus=i++
print("%d\n",value);
}
int main()
{
fun(0);
fun(1);
fun(2);
fun(3);
return 0;
}

程序输出为:
0
0
0
0
程序每次输出都为0,是因为value是静态类型,只会定义一次。也就是说,不管调用func()多少次,static int value=i++这个定义语句只会在第一次调用的时候执行,由于第一次执行的时候i=0,所以value也就被初始化为0了,以后调用fun()都不会再执行这条语句了。
下面,我们再给出一个例子,供大家自己分析:

#include<stdio.h>
void fun(int i)
{
static int value=i++;
value=i++;
print("%d\n",value);
}
int main()
{
fun(0);
fun(1);
fun(2);
return 0;

输出结果为:
1
1
2

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值