c++静态变量(static)

写在前面:

1.C++中的全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。

2.C++中,在函数或一个代码块内部声明的变量,称为局部变量。它们只能被函数内部或者代码块内部的语句使用。当局部变量被定义时,系统不会对其初始化,必须自行对其初始化。

在程序中,局部变量和全局变量的名称可以相同。但是在函数内的局部变量与全局变量是两个独立的变量,互不影响,全局变量的值可以在局部函数内重新赋值。

注:全局变量从定义处开始至程序结束起作用,即全局变量存在有效作用域。

#include<iostream>
using namespace std;

int main()
{
     cout<<"a= "<<a<<endl; //编译不通过,a是未知字符
     return 0;
}
int a=10; //全局变量从此处定义

若要想让 main 函数也使用全局变量 a,可以用 extern 对全局变量进行声明,就可以合法使用了。

#include<iostream>
using namespace std;

int main()
{
     extern int a;
     cout<<"a= "<<a<<endl; //合法,输出10
     return 0;
}
int a=10; //全局变量从此处定义

静态变量

存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和 static 变量。

1.静态局部变量:作为 static 局部变量在函数内定义,它的生存期为整个源程序,但是其作用域仍与局部变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它!

#include <iostream>
using namespace std;

int count = 1; //全局变量
int fun()
{
    static int count = 10; // 在第一次进入这个函数的时候,变量 count 被初始化为 10  
    return count--; //以后每次进入该函数就不会被再次初始化了,count 的值是上一次函数运行之后的值  (如果不用static的话,每次调用局部变量count都是10,也就是每次都会先初始化)     
}

int main()
{
   for(;count <= 10; ++count)
      cout<<"全局变量:"<<count<<"      静态局部变量:"<<fun()<<endl;
   return 0;
}


输出:
全局变量:1      静态局部变量:10
全局变量:2      静态局部变量:9
全局变量:3      静态局部变量:8
全局变量:4      静态局部变量:7
全局变量:5      静态局部变量:6
全局变量:6      静态局部变量:5
全局变量:7      静态局部变量:4
全局变量:8      静态局部变量:3
全局变量:9      静态局部变量:2
全局变量:10      静态局部变量:1

由此可见全局变量和局部静态变量 count 的作用域是不同的。静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。

2.静态全局变量:也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。

从分配内存空间看:全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间。

总结:

static 全局变量:改变作用范围,不改变存储位置

static 局部变量:改变生命周期,不改变作用范围

写在后面:

静态函数 :在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。

如果在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,这种函数也称为内部函数。定义一个内部函数,只需在函数类型前再加一个“static”关键字即可。

参考:https://www.runoob.com/cplusplus/cpp-variable-scope.html
原文链接: https://www.cnblogs.com/USTC-ZCC/p/13924504.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/204734

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午9:58
下一篇 2023年2月12日 下午9:58

相关推荐