C/CPP : static 关键字 及 变量函数的不同

本文由zaccur整理编辑,如需转载请注明出处。


  • 综述

static关键字是C, C++中都存在的关键字。从字面理解是“静态的“的意思,与此相对应的,应该是“动态的“。

static的作用主要有以下3个:

  1. 局部数据:扩展生存期(C/CPP);
  2. 全局数据/函数:限制作用域(C/CPP);
  3. 类成员数据/函数:数据唯一性(ONLY CPP);
  • 局部数据:扩展生存期( C/CPP)

此作用主要是针对局部变量 来说。

举例:

static是按照程序的生命周期来分配释放变量的,如果在main前设置断点,然后查看static变量,已经被初始化,也就是说static在执行main函数前已经被初始化。也就是在程序初始化时被分配。

引申:在程序中,常用内存类型主要有堆、栈和静态存储区。

要理解static局部变量就必须首先理解这三种内存类型。

主要区别:

1) 堆是由低地址向高地址扩展,栈是由高地址向低地址扩展。

2) 堆是不连续的空间,栈是连续的空间。

3) 在申请空间后,栈的分配要比堆的快。对于堆,先遍历存放空闲存储地址的链表、修改链表、再进行分配;对于栈,只要剩下的可用空间足够,就可分配到,如果不够,那么就会报告栈溢出。

4) 栈的生命期最短,到函数调用结束时;静态存储区的生命期最长,到程序结束时;

堆中的生命期是到被我们手动释放时(如果整个过程中都不手动释放,那就到程序结束时)。

引申:存储说明符auto,register,extern,static的存储期

  • 全局数据/函数:限制作用域( C/CPP)

此作用主要针对全局变量 来说。

补充:在C语言中,static对于全局变量/函数的作用:隐藏

当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。

举例说明。我们要同时编译两个源文件,一个是xxx.c,另一个是main.c。

所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。

如果加了static,就会对其它源文件隐藏。

此例中,g_var是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。

例如在g_var和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量(局部变量),static还可以扩充其生命周期,同时初始化的时候直接默认赋值0(全局变量默认)。

  • 类成员数据/函数:数据唯一性( ONLY CPP)

此作用是C++对static关键字的重用。主要针对类里静态成员数据/成员函数

在这里面, static既不是限定作用域的, 也不是扩展生存期的作用, 而是指成员变量/函数在此类中的唯一性。

表示static成员变量和函数属于一个类而不是属于此类的任何特定对象的变量和函数.

这是与普通成员函数的最大区别, 比如在对某一个类的对象进行计数时,计数生成多少个类的实例,都可以用到静态数据成员。 (针对静态数据成员而言, 成员函数不管是否是static,在内存中只有一个副本,普通成员函数调用时,需要传入this指针,static成员函数调用时,没有this指针。)

static数据成员的初始化:

(1) 初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆。

(2) 初始化时不加该成员的访问权限控制符private,public等。

(3) 初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员。

(4) 静态数据成员是静态存储的,它是静态生存期,必须对它进行初始化。

static成员函数:

静态成员函数和静态数据成员一样,它们都属于类的静态成员,都不是任何对象的成员。

因此,对静态成员的引用不需要用对象名。

静态成员函数仅能访问静态的数据成员,不能访问非静态的数据成员,也不能访问非静态的成员函数,这是由于静态的成员函数没有this指针。

参考:

c/c++ static 用法总结(三版本合一)来自 <https://blog.csdn.net/mznewfacer/article/details/6898005>

C/C++中extern关键字详解 来自 <https://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html>

c 多文件全局变量_C/CPP : static 关键字 及 变量函数的不同相关推荐

  1. 浅谈C语言static关键字 静态变量 函数

    目录 static对变量修饰 局部变量 全局变量 函数 static对变量修饰 局部变量 普通局部变量存储于进程栈空间,使用完毕会立即释放. 静态局部变量存储于进程的全局数据区,即使函数返回,它的值也 ...

  2. C/Cpp / static 关键字

    --------------------------------------------- -- 时间:2019-02-20 -- 创建人:Ruo_Xiao -- 邮箱:xclsoftware@163 ...

  3. C语言static关键字修饰变量及函数时的用法和原理

    目录 一.static关键字修饰局部变量 二.static关键字修饰全局变量 三.static关键字修饰函数 一.static关键字修饰局部变量 在内存中,往往将其分为三个区块,栈区,堆区,静态区.C ...

  4. c 多文件全局变量_C语言开发单片机为啥都是全局变量形式?

    01 前言 全局变量简直就是嵌入式系统的戈兰高地.冲突最激烈的双方是:1. 做控制的工程师:2. 做非嵌入式的软件工程师. C语言.单片机.嵌入式相关资料,可以加我微信"dqjob12345 ...

  5. static关键字(修饰函数、局部变量、全局变量)

    在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)先来介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有 ...

  6. c 多文件全局变量_C语言开发单片机为什么大多数都采用全局变量的形式?

    点击上方蓝字关注我哦- 01 前言 全局变量简直就是嵌入式系统的戈兰高地.冲突最激烈的双方是1. 做控制的工程师 2. 做非嵌入式的软件工程师. 02 做控制的工程师特点 他们普遍的理解就是" ...

  7. C++ static关键字

    C++ static关键字 static关键字可用于声明全局范围.命名空间范围和类范围的变量和函数. 静态变量还可在本地范围声明. 先介绍几个概念: 静态持续时间,在程序启动时分配对象或变量,并在程序 ...

  8. php全局变量的关键字,PHP变量作用域(全局变量局部变量)globalstatic关键字用法实例分析...

    本文实例讲述了PHP变量作用域(全局变量&局部变量)&global&static关键字用法.分享给大家供大家参考,具体如下: 我们知道,变量呢,其实就相当于我们用来储存信息的容 ...

  9. 对C语言 static作用——修饰 变量(全局变量/局部变量)、函数

    *******************************概念******************************************** ********************** ...

最新文章

  1. 一次“ora-12170 tns 连接超时”的经历
  2. python 作用with_即使__init__方法有效,Python中的With语句仍返...
  3. 图文并茂,傻瓜都能看懂的 JVM 内存布局
  4. 前端学习(529):等分布局存在间距得实现得解决方案
  5. 串口与modem流量控制大全(2)
  6. Windows XP系统的“恢复”办法
  7. Java基础---集合的概述---list、set、map、泛型、collections
  8. python实验报告代写_TensorFlow作业代写、代做Python程序语言作业、代写github课程作业、Python实验作业代写...
  9. PRML5-神经网络(1)
  10. 什么是传递(Pass-Through)会话
  11. Mysql之无法查询中文字解决办法
  12. 通过寄生组合式继承创建js的异常类
  13. 计算机性能怎么测试软件,如何测试电脑性能|检测电脑性能的方法
  14. 关于jq22.com网站访问不了的问题
  15. 查看pagesize和blocksize以及inodesize
  16. 越狱相关三:OpenSSH
  17. 十六条超炫代码让你的QQ空间改头换面(转)
  18. PS4 不支持USB存储设备的文件系统 如何解决?
  19. C语言路漫漫,其修远兮
  20. 微信开发者工具,page里面的data在js的方法里面修改

热门文章

  1. python怎么导入视频-python中的导入如何使用,以及.和..相对导入的使用
  2. 想学python有什么用-学python日常工作有什么用?
  3. python编程案例教程书籍-Python程序设计案例教程
  4. python主要用途-Python能用来做什么?以下是Python的三大主要用途
  5. python读取文件某一行-python计算文件的行数和读取某一行内容的实现方法
  6. Opengl-光照-颜色(其实要想做出好看的东西这章最重要了)
  7. spring中事务的设计和实现
  8. HDU2019 数列有序
  9. MYSQL表根据列拆分的问题
  10. PhpStorm 默认快捷键