static之面向过程中的理解

一、静态全局变量

在全局变量前加上关键词static,那么它便被定义成了一个静态全局变量,下次我们列举一个静态全局变量的

例子:

#include<iostream>
using namespace std;
static int n;  //静态全局变量
void funct()
{
    n++;
    cout << n << endl;
}
int main()
{
    n = 10;
    cout << n << endl;
    funct();

    return 0;
}

们把n定义为了静态全局变量,那么它的特点是:

1、该变量在全局数据区中分配内存,并且若是未初始化则自动被程序初始化为0。

2、静态全局变量在定义它的源文件内有效,其他源文件无法访问它。

第一点很好理解,那么第二点是什么意思,我们通过一个例子来解释它:

//文件1中
#include<iostream>
using namespace std;
static int n;  //静态全局变量
void funct()
{
    n++;
    cout << n << endl;
}
int main()
{
    n = 10;
    cout << n << endl;
    funct();

    return 0;
}
//文件2中
#include<iostream>
using namespace std;
extern int n;
void funct()
{
    n++;
    cout << n << endl;
}
int main()
{
    funct();
    return 0;
}
   

如果像上述例子一样(extern表示变量或函数定义在其他文件内),那么编译器就会报错,因为文件1中的n是

静态全局变量,文件2不能调用它。

静态全局变量和全局变量的不同点就在全局变量可以被其他文件所调用,当你定义为静态全局变量时,你在其

他文件中定义相同名称的变量不会产生冲突。

二、静态局部变量

在局部变量前加关键词static,那么它便被定义成了一个静态局部变量,我们也先列举一个静态局部变量的

例子:
#include<iostream>
using namespace std;
void sum()
{
    static int x = 0;  //静态局部变量
    x++;
    cout << x << endl;
}
int main()
{
    for(int i=0;i<10;i++)
        sum();

    return 0;
}

我们通常在定义普通的局部变量时,它会在栈空间上分配内存。我们若是多次调用这个局部变量所在的函数

,每次调用这个局部变量在栈上的位置都不一定相同。随着函数体的结束,系统分配给它的内存空间也会随之被回收。但是就像上面的例子一样,我们需要对几次调用之间的值进行保存,这是静态局部变量就解决了我们的问题。

静态局部变量的特点如下:

  • 在全局数据区中分配内存;
  • 静态局部变量在程序执行到该对象的声明处时首次被初始化,以后在进行函数调用不在进行初始化,如果首次没有显式初始化,那么它被初始化为0;
  • 它始终驻留在全局数据区,直到整个程序结束,所以它的生存期是整个程序的执行过程,但是它的作用域是局部作用域,当定义它的函数结束时,它的作用域也随之消失;
三、静态函数
在函数的返回值类型之前加上static,该函数便被定义为了静态函数。
当我们程序中有很多个源文件的时候,我们会让某个源文件提供一些外界需要的接口,但是我们会有很多函
数是为了这些借口编写,所以我们并不希望这些函数被其源文件所访问,这时候我们便可以用static修饰这些函数。
static函数很好的解决了我们不同源文件中函数同名的问题,因为我们在一个源文件中定义的静态函数是不
能被其他源文件所见的。
我们下面看一个静态函数的例子:
#include<iostream>
using namespace std;
static void fn()     //定义静态函数
{
    int n = 10;
    cout<<n<<endl;
}
int main(void)
{
    fn();
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值