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/C++中的变量和静态变量的更多相关文章

  1. java中的static使用--静态变量、静态方法

    Java 中的 static 使用之静态变量 大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立.然而在某些时候,我们更希望该类所有的对象共享同一个成员.此时就是 s ...

  2. 内部类访问外部类的变量必须是final吗,java静态方法中不能引用非静态变量,静态方法中不能创建内部类的实例

    内部类访问外部类的变量必须是final吗? 如下: package com.java.concurrent; class A { int i = 3; public void shout() { cl ...

  3. js中的全局变量和静态变量的使用, js 的调试?- 如果js出错, js引擎 就会停止, 这会 导致 后面的 html中 refer 该函数时, 会报错 函数为定义!!

    效果里面的函数, 如show, hide,slideDown等, 这些都叫 "效果"函数, 但是里面可以包含动画, 也可以 不包含动画. 动画,是指 元素 的内容 是 逐渐 显示/ ...

  4. 浅析c语言中的变量(局部变量,外部变量,静态变量,寄存器变量)[转]

    c语言中变量分为四类,分别是 1.auto   自动变量 2.static   静态存贮分配变量(又分为内部静态和外部静态) 3.extern  全程变量(用于外部变量说明) 4.register   ...

  5. JAVA中的static关键字(静态变量和成员变量)

    static的特点: 1.static是一个修饰符,用于修饰成员: 2.static修饰的成员被所有的对象所共享: 3.static优先于对象存在,因为static的成员随着类的加载就已经存在了: 4 ...

  6. Swift中的类型属性(静态变量)

    http://blog.haohtml.com/archives/15098 Swift中的类型属性(静态变量) Posted on 2014/06/13 类型属性语法 在 C 或 Objective ...

  7. JVM存储位置分配——java中局部变量、实例变量和静态变量在方法区、栈内存、堆内存中的分配

    Java中的变量根据不同的标准可以分为两类,以其引用的数据类型的不同来划分可分为“原始数据类型变量和引用数据类型变量”,以其作用范围的不同来区分可分为“局部变量,实例变量和静态变量”. 根据“Java ...

  8. Java中局部变量、实例变量和静态变量在方法区、栈内存、堆内存中的分配

    转自:https://blog.csdn.net/leunging/article/details/80599282 感谢CSDN博主「leunging」的总结分享 ———————————————— ...

  9. Python-类变量,成员变量,静态变量,类方法,静态方法,实例方法,普通函数

    #coding:utf-8class class_name(object): class_var = 'I am a class variable' #类变量 def __init__(self): ...

  10. [javase学习笔记]-8.2 成员变量与静态变量的差别

    这一节我们看一看成员变量与静态变量的差别所在. 什么是静态变量呢?我们上节用statickeyword时就提到了静态变量.也就是说用statickeyword修饰的变量就是静态变量. 我们在6.4节学 ...

随机推荐

  1. ExtJs Ext.data.Model 学习笔记

    Using a Proxy Ext.define('User', { extend: 'Ext.data.Model', fields: ['id', 'name', 'email'], proxy: ...

  2. 树莓派Raspberry命令行配置无线网络连接

    前言: 树莓派有多种联网的方式,通过有线网或者通过无线网.通过有线网连接是比较简单的,在开启dhcp的路由器下,直接插上网线就可以联网,本文介绍树莓派无线联网的方式.再没联网的情况下,如果没有屏幕等外 ...

  3. Windows下进程通信方式

    当线程分属于不同进程,也就是分驻在不同的地址空间时,它们之间的通讯需要跨越地址空间的边界,便得采取一些与同一进程中不同线程间通讯不同的方法.在Windows程序中,各个进程之间常常需要交换数据,进行数 ...

  4. 15 款优化表单的 jQuery 插件

    网页上的表单提供给用户的一种交互的方式,用户输入数据,提交到服务器,等待后续的处理.这些表单在我们浏览的网页中随处可见,也容易被我们忽略. 比如,“联系我们”页面会提供一个表单给用户填写他们的信息和想 ...

  5. thikphp 简单的接口骨架

    //get id 获取内容,调用xml方法 public function get(){ $id = $_GET['id'];//接收id $User = M('user'); //$val-> ...

  6. selenium测试(Java)--执行JS(十八)

    1.  操作滚动条 package com.test.js; import org.openqa.selenium.By; import org.openqa.selenium.Dimension; ...

  7. 【转载】WebApi 接口测试工具:WebApiTestClient

    正文 前言:这两天在整WebApi的服务,由于调用方是Android客户端,Android开发人员也不懂C#语法,API里面的接口也不能直接给他们看,没办法,只有整个详细一点的文档呗.由于接口个数有点 ...

  8. 【Java面试题】25 同步和异步有何异同,在什么情况下分别使用他们?举例说明。

    如果数据将在线程间共享.例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取. 当应用程序在对象上调用了一个需要花费很长时间 ...

  9. Webpack vs Gulp(转载)

    理想的前端开发流程 在说构建工具之前得先说说咱期望的前端开发流程是怎样的? 写业务逻辑代码(例如 es6,scss,pug 等) 处理成浏览器认识的(js,css,html) 浏览器自动刷新看到效果 ...

  10. Linux性能研究(总)

    http://www.vpsee.com/2009/11/linux-system-performance-monitoring-introduction/ http://www.jb51.net/L ...