zoukankan      html  css  js  c++  java
  • C/C++中的变量和静态变量

      static有两种用法:一是面向过程程序设计语言中的static,用于普通变量和函数,不涉及类;二是面向对象程序设计中的static,主要涉及static在类中的作用。

    面向过程设计中的static

    1. 非static全局变量
        非static全局变量保存在内存中程序的数据段,生存期为程序的整个生存期,有效范围为整个程序,只需要在一个源文件中被定义,就可以作用于所有源文件
    2. 非static局部变量
        非static局部变量保存在内存中数据的栈内存区域,生存期为该局部变量定义的函数的调用期间,有效范围为定义该局部变量的函数内部。当该函数调用结束后,变量被撤销,其所占用的内存被收回
    3. static全局变量
        static全局变量保存在内存中程序的数据段,生存期为从该变量第一次被定义到程序结束,有效范围为全局,但如果程序含有多个文件,则只能在被定义的文件中被访问,在其他文件模块中不能被访问
    4. static局部变量
        static局部变量保存在内存中程序的数据段,生存期为从该变量第一次被定义到程序结束,有效范围为该变量被定义的函数内部。

       静态变量会被放在程序的静态数据存储区(数据段)(全局可见)中,这样可以在下一次调用的时候还可以保持原来的值,这是与堆变量和栈变量的区别;变量用static告知编译器,自己仅仅在变量定义的作用范围内可见,这是与全局变量的区别
    (1)若全局变量仅仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
    (2)若全局变量仅仅被单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
    (3)设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时候,要考虑重入问题,因为他们都在静态数据存储区,全局可见;
    (4)如果我们需要一个可重入的函数,则一定要避免函数中使用static变量;
    (5)函数中必须使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

    面向对象设计中的static

      1. 非静态成员变量
          非静态成员变量在类的每个对象中都存在有一个副本,各个对象中的相应副本相互独立。 非静态成员变量和对象挂钩,生存期间为其所在对象的生存期间。
      2. 非静态成员函数
          非静态成员函数的第一个隐含参数为调用该函数的对象的this指针。 非静态成员函数可以访问类的非静态成员变量,也可以访问类的静态成员变量和调用类的静态成员函数。
      3. 静态成员变量
          静态成员变量为该类的所有对象共享的变量,所有的对象都只访问这一个变量实例。静态成员变量可以通过类名::变量名 或者 实例名.变量名来访问
      4. 静态成员函数
          静态成员函数没有隐含的this指针参数,且只能访问类的静态成员变量和全局的变量,可以作为回调函数来使用。
  • 相关阅读:
    configure: error: invalid variable name: `'
    [bzoj2002][Hnoi2010]Bounce弹飞绵羊——分块
    [bzoj2049][Sdoi2008]Cave 洞穴勘测——lct
    [bzoj4765]普通计算姬——分块
    [bzoj4766]文艺计算姬——完全二分图生成树个数
    [bzoj2243][SDOI2011]染色——树链剖分+线段树
    [bzoj3306]树——树上倍增+dfs序+线段树
    [bzoj1977][BeiJing2010组队]次小生成树 Tree——树上倍增+lca
    [bzoj3697]采药人的路径——点分治
    小蒟蒻的天坑
  • 原文地址:https://www.cnblogs.com/gtarcoder/p/4625369.html
Copyright © 2011-2022 走看看