`
waret
  • 浏览: 131742 次
  • 性别: Icon_minigender_1
  • 来自: 天津
文章分类
社区版块
存档分类
最新评论

静态变量 static 全局变量 global

阅读更多

    静态变量,在java也叫类变量。从名字可以看出它是属于某个类的而不是类的实例。它的关键字是static存储在静态存储区,当程序执行,类的代码被加载到内存,就为类的静态变量分配了内存空间,它是属于类的,也就是每个实例对象都是对应于同一个静态变量,静态变量的内存空间直到程序退出才释放所占用的内存空间。静态变量直接通过类名访问(java 也能通过对象名访问)。

    全局变量,关键字global也是静态存储方式,存储在静态存储区。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。

全局变量和静态变量的区别:
    全局变量在整个工程文件内都有效;
    静态全局变量只在定义它的文件内有效;
    静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;
    局部变量在定义它的函数内有效,但是函数返回后失效。

    全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

也能这么看:
    A.若全局变量仅在单个文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
    B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;
    D.如果我们需要一个可重入的函数,那么我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的函数);
    E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

    从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。应予以注意。
    变量的6种作用:全局作用域,文件作用域,命名空间作用域,类作用域,局部作用域,语句作用域。

附:static 有着不寻常的历史:起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义。最后,C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数(与Java中此关键字的含义相同)。

分享到:
评论

相关推荐

    对Pyhon实现静态变量全局变量的方法详解

    python不能像C++一样直接定义一个static变量或者通过extern来导入别的库的变量而实现数据共享,但是python的思想是通过模块化来解决这个问题,就是通过模块来实现全局变量。 首先新建一个global_var_model .py的文件,...

    浅谈PHP变量作用域以及地址引用问题

    作用域的概念: ...这个可以访问的范围称为作用域...3、静态变量:用static修饰只存在于函数作用域的变量,函数执行结束后其值并不消失。注:初始化后不能再次进行初始化,不能用表达式来赋值。 复制代码 代码如下:functi

    Static-Cache-Manager-for-PHP:php的全局静态缓存管理器

    适用于PHP的静态缓存管理器关于在某些应用程序中,初始化一组数据并将其存储在静态变量中以在整个应用程序范围内可用,而不必在每次需要时都对其进行初始化非常有用。 拥有大量此类静态缓存变量可能会导致不良的代码...

    浅谈iOS开发中static变量的三大作用

    当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。 下面是a.c的内容 char a = 'A'; // global...

    c++中的static修饰符示例详解

    前言 本文主要给大家介绍了关于c++中static修饰符的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。...1.存在于全局作用域中的静态变量 //全局可访问,在内存中只有一份拷贝,

    static关键字的作用详解

    当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。 下面是a.c的内容 代码如下:char a = ‘A’;...

    VB试题.doc

    10、在过程内用_ Static__声明的变量为静态变量,在执行一个过程结束时,过程中所用到的 Static变量的值会保留,下次再调用此过程时,变量的初值是上次调用结束时被保留的值。 11、在模块文件中的声明部分用Global...

    关于C/C++中static关键字的作用总结

    (static函数,static变量均可)当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。举例来说明。同时编译两个源文件,一个是a.c,另一个是main.c。 代码如下://a.cchar a = ‘A’; // ...

    在 ASP.NET 中使用计时器执行用户代码(原创代码

    在 Global.asax 中加入静态对象(变量) public static Timer gtimer = null; // 定义全局定时器类对象 public static int gcount = 0; // 测试用计时器变量 在 Global.asax 中的 Application_OnStart 事件过程中...

    delphi编译错误.txt

    Cannot override a static method 不能覆盖静态方法 Cannot read a write-only property 不能读取只写属性 Case label outside of range of case expression CASE标号超出了CASE表达式的范围 Circular unit ...

    深度探索模C++对象模型PDF

    全局对象(Global Objects) 局部静态对象(Local Static Objects) 对象数组(Array of Objects) Default Constructors和数组 6.2 new和delete运算符 针对数组的new语意 Placement Operator new的语意 6.3 临时性...

    深度探索C++对象模型 超清版

    全局对象(Global Objects) 局部静态对象(Local Static Objects) 对象数组(Array of Objects) Default Constructors和数组 6.2 new和delete运算符 针对数组的new语意 Placement Operator new的语意 6.3 临时性...

    DX1.5 手机正式版

    3:最重要的是初始化一个全局数组(这里说并不是超级全局变量)$_G数组与 $this->var属性,其中$_G数组是供外部代码掉用的,而$this->var是类内部掉用的(这个只是猜测) 这个函数得到了一些重要信息 DISCUZ_ROOT ...

    《深度探索C++对象模型》(Stanley B·Lippman[美] 著,侯捷 译)

    全局对象(Global Objects) 局部静态对象(Local Static Objects) 对象数组(Array of Objects) Default Constructors和数组 6.2 new和delete运算符 针对数组的new语意 Placement Operator new的语意 6.3 临时性...

    深入浅出MFC【侯捷】

    C++程序的生与死:兼谈构造函数与解构函数 四种不同的对象生存方式(in stack、in heap、global、local static) 执行期类型信息(RTTI) 动态生成(Dynamic Creation) 异常处理(Exception Handling) Template ...

    深入浅出MFC 2e

    四种不同的对象生存方式(in stack、in heap、global、local static) 执行期类型信息(RTTI) 动态生成(Dynamic Creation) 异常处理(Exception Handling) Template Template Functions Template Classes ...

    侯捷- -深入浅出MFC

    四种不同的对象生存方式(in stack、in heap、global、local static) 执行期类型信息(RTTI) 动态生成(Dynamic Creation) 异常处理(Exception Handling) Template Template Functions Template Classes ...

    C#微软培训资料

    11.3 静态和非静态的方法.129 11.4 方法的重载.130 11.5 操作符重载.134 11.6 小 结.137 第十二章 域 和 属 性 .139 12.1 域 .139 12.2 属 性 .143 12.3 小 结 .146 第十三章 事件和索引指示器 .148 ...

    LuaBind 源码 (Lua增强库)

    你正在使用一个UNIX系统(或者 cygwin),他们将使得构建LuaBind静态库变得很简单.如果 你正在使用 Visual Studio ,很简单的包含 src 目录下的文件到你的工程即可. 构建LuaBind的时候,你可以设定一些选项来使得库更加...

    C++MFC教程

    |------ 4.2 Static Box |------ 4.3 Edit Box |------ 4.4 Scroll Bar |------ 4.5 List Box/Check List Box |------ 4.6 Combo Box/Combo Box Ex |------ 4.7 Tree Ctrl |------ 4.8 List Ctrl |------ 4.9 Tab ...

Global site tag (gtag.js) - Google Analytics