C/C++中的变量和静态变量

转载 2018年04月15日 17:17:20

原博主:https://www.cnblogs.com/gtarcoder/p/4625369.html

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指针参数,且只能访问类的静态成员变量和全局的变量,可以作为回调函数来使用。

C++虚函数、静态变量

虚函数是在类中被声明为virtual的成员函数,当编译器看到通过指针或引用调用此类函数时,对其执行动态联编,即通过指针(或引用)指向的类的类型信息来决定该函数是哪个类的。通常此类指针或引用都声明为基类...
  • shuxingcq
  • shuxingcq
  • 2017年03月09日 20:53
  • 244

C++全局和静态变量初始化顺序的研究

C++全局和静态变量初始化顺序的研究 我在编程的时候遇到了一个非常棘手的问题,就是静态变量初始化的问题。有的情况一个全局(静态)变量依赖另外一个全局(静态)的变量。比如在工厂模式中使用隐式注册注册一...
  • jiangcaiyang123
  • jiangcaiyang123
  • 2012年03月27日 15:36
  • 5035

在C语言中,static静态变量,extern外部变量的区别

1:什么是static static,叫做静态变量。一般用于全局变量里面,首先,我们来考虑一下为什么要用到static,我们可以想一下,一个项目其实是由很多位工程师一起来完成的,他们之间是互相独立完...
  • swee111
  • swee111
  • 2017年06月14日 14:19
  • 230

C语言 静态变量与自动变量的区别

C语言中使用auto 关键字声明自动变量,使用static关键字声明静态变量。
  • LiuBo_01
  • LiuBo_01
  • 2017年10月19日 13:18
  • 1165

Java中静态常量和静态变量的区别

如下:测试java中静态常量和静态变量区别的样例,表明两者加载时的区别。StaticClass类中定义了静态常量FIANL_VALUE和静态变量VALUE,静态代码块的打印语句表示类被加载:[java...
  • qq853632587
  • qq853632587
  • 2017年10月10日 16:58
  • 1640

静态变量和常量的区别

共同点: 1、static和const在编译时直接分配内存。 区别: 1、(本质)static是类型引用,const是实例引用。 2、(初始化)静态变量的初始值必须是一个常量。静态初始...
  • haobaworenle
  • haobaworenle
  • 2017年03月25日 22:55
  • 3371

尝试使用枚举类存储静态变量

一般在项目中会有一组或者几组数据用来表示公用变量,这样在散布各处的业务代码中就已变量名本身代替变量的具体值, 这样避免了当公用变量的含义和值改变的时候可能引起的各种问题。...
  • tzdwsy
  • tzdwsy
  • 2015年08月09日 14:22
  • 1548

C++:外部变量和静态变量

外部变量的定义和声明是不同的。外部变量的定义只能有一次,它的位置在所有函数之外,而统一文件中的外部变量的声明可以有多次,它的位置可以在函数之内,也可以在函数之外。 系统根据外部变量的定义,而不是声明,...
  • baidu_28446365
  • baidu_28446365
  • 2018年03月21日 19:38
  • 13

java构造函数和静态变量的执行顺序

Java初始化顺序 1在new B一个实例时首先要进行类的装载。(类只有在使用New调用创建的时候才会被java类装载器装入); 2,在装载类时,先装载父类A,再装载子类B 3,装载父类A后,完...
  • nchu2020
  • nchu2020
  • 2015年11月14日 18:08
  • 189

外部变量和静态变量

外部变量 1.简介             外部变量是在函数外部定义的全局变量,它的作用域是从变量的定义处开始,到本程序文件的结尾。在此作用域内,全局变量可为各个函数所引用。编译时将外部变...
  • tom555cat
  • tom555cat
  • 2013年12月05日 20:08
  • 1101
收藏助手
不良信息举报
您举报文章:C/C++中的变量和静态变量
举报原因:
原因补充:

(最多只允许输入30个字)