static,即静态声明。它在 作用域、存储方式、生命周期 等各方面影响一个变量或函数。文章将从 局部变量、全局变量、普通函数、类的static成员(包括数据成员与成员函数)来总结static。

  • 全局变量

   所有的全局变量,无论是否是static的,都是存储于静态存储区的。全局变量本身就是静态存储方式,将全局变量声明为static是为了将变量的作用域限制在本翻译单元中(本源文件中),使该全局变量不能被源程序的其他翻译单元所引用。普通全局变量使用extren声明可以拓展其作用域至其他翻译单元中。

   可以总结为:static改变了全局变量的作用域,而不改变变量的存储位置与生命周期。  

  • 局部变量

   局部变量即在函数内定义的或在块中定义的变量。static对局部变量的作用不同于全局变量。普通局部变量在离开其作用域(如离开定义它的函数或块的花括号)时即消失,而static变量却存在于程序运行的整个过程,也即是说,static声明改变了局部变量的生命周期。普通局部变量是存储在动态存储区的(堆),而static局部变量是存储在静态存储区,因而普通局部变量在函数每次被调用时都被重新分配内存地址,而静态局部变量则在程序运行过程中占据固定的内存。

   可以总结为:static改变了局部变量的存储方式与生命周期,而不改变变量的作用域。

  • 普通函数

   这里的普通函数是为了与类的成员函数区别开来。函数在定义时默认是外部的,通过extren声明即可被其他源文件引用,static声明将函数的作用域限制在本翻译单元中,成为内部函数。static函数在内存中只有一份,普通函数在每个调用中维持一份拷贝。

  可以总结为:static使得函数在内存中只有一份,并将函数作用域限制在当前源文件。

另外,static有几个优点总被提起:

    1. 避免了链接时与其他源文件中的变量命名引起冲突。

    2.对于c函数而言,static对函数进行了信息屏蔽,只给当前文件中其他函数使用。

  • 类static成员

  static声明对类成员的作用可以这样概括:static使得成员从“属于类对象”变成了“属于类,而不属于类对象”。

  对于数据成员:

    1.static数据成员必须在类定义体的外部进行定义。

class BOOK{    private:        //折扣        static float discount;};//在类定义体外部定义并初始化float BOOK::discount = 0.95f;

2.不像普通数据成员,static数据成员不能在构造函数中进行初始化。正如上面所说,它只能在类外部定义并初始化。然而有一个例外,整型的const static 数据成员可以在类的定义体中进行初始化。但需注意的是,const static数据成员在类的定义体中初始化时,该数据成员仍必须在类的定义体之外进行定义(不必再指定初始值了)。

 class BOOK{    private:        //折扣        const static  int  discount=1;};const  int BOOK::discount;
  • 类static成员函数

  在类内部声明的static成员函数,在类定义体外部进行定义时无须重复指定static关键字。

  对于static成员函数,它同样是不属于类对象的,因而它没有this指针。它可以直接访问类的static数据成员,不能直接使用非static成员,原因是非static数据成员属于类对象,使用非static数据成员时必须通过this指针来确定是这些成员属于哪个类对象,然而上面说了,static成员函数没有this指针。

  static成员函数不能被声明为const。实际上,成员函数被声明为const的本质是它向编译器保证不会通过这个函数来修改类对象在内存中的每一个bit的内容(可以看《effective C++》 条款03 “尽可能使用const” ),然而我们知道,static成员函数并不属于类对象,更谈不上要保证不修改某一对象的内存了。

  另外,虚函数不能为声明为static,为什么呢?原因还是static成员函数没有this指针。virtual funtion运行时绑定是多态的基础,没有this指针多态的概念无法践行。

PS:如果文章内容有错误,恳请指出,万分感谢。

static在内存层面的作用_static关键字总结相关推荐

  1. static在内存层面的作用_static的作用和内存划分?

    有时希望函数中的局部变量的值在函数调用结束后不消失而继续保留原值,即其占用的存储单元不释放,在下一次再调用的时候该变量已经有值.这时就应该指定该局部变量为静态变量,用关键字 static 进行声明. ...

  2. static在内存层面的作用_「C++ Primer plus 心得」9.内存模型和名称空间

    本章内容包括: 单独编译 存储持续性.作用域和链接性 定位new运算符 名称空间 C++ 为在内存中存储数据方面提供了多种选择.可以厅数据保留在内存中的时间长度(存储持续性)以及程序的哪一部分可以访问 ...

  3. static在内存层面的作用_虚拟地址空间--用户进程看到的自己所占用的内存

    我们知道内核管理物理内存,其实除了管理本身内存外,还必须管理用户空间中进程的内存,我们称这个内存为进程地址空间,也就是系统中每个用户空间进程所看到的内存. 传统的C语言编译出来的进程地址空间包含哪些对 ...

  4. static在内存层面的作用_C++内存管理笔记

    第一部分--基础部分 1.内存分配层次 C++ 申请内存分配: 1. CRT : malloc / free 2. C++ primitives : new , new[] , new() , ::o ...

  5. 全面理解Java内存模型(JMM)及volatile关键字

    [版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/72772461 出自[zejian ...

  6. C/C++中涉及存储方式的关键字:auto,static,register,extern2009-01-22 11:23auto关键字:

    C/C++中涉及存储方式的关键字:auto,static,register,extern 2009-01-22 11:23 auto关键字: auto对象和变量被存储在栈中,它的生命周期仅存在于它的声 ...

  7. 13、内存管理—变量作用

    内存管理-变量作用 一.普通局部变量 include <stdio.h>int main(int argc, char const *argv[]) {int a = 10;if(1){i ...

  8. java关键字的作用_java关键字及其作用

    java关键字及其作用 java 关键字及其作用 一. 关键字总览:关键字 含义abstract 表明类或者成员方法具有抽象属性assert 用来进行程序调试boolean 基本数据类型之一,布尔类型 ...

  9. c语言staticint的作用,c语言中static是什么意思?作用是什么

    c语言中static是什么意思?作用是什么 发布时间:2020-04-30 10:07:02 来源:亿速云 阅读:290 作者:小新 今天小编给大家分享的是c语言中static是什么意思?作用是什么, ...

最新文章

  1. 使用神经网络生成抽象随机艺术
  2. 使用winrar自解压功能制作安装包
  3. Photoshop绘制植物大战僵尸中的食人花
  4. Java进阶(五)Java I/O模型从BIO到NIO和Reactor模式
  5. 让Dreamweaver支持phtml
  6. 异步FIFO的FPGA实现
  7. Python dataframe列拆分多行与统计
  8. linux命令编写,编写简单的linux命令
  9. MySQL数据库入门到高薪培训教程(从MySQL 5.7 到 MySQL 8.0)
  10. javascript入门_您需要一个JavaScript入门工具包
  11. opencv特效编辑之雕刻效果
  12. 【读书笔记《Android游戏编程之从零开始》】9.游戏开发基础(如何快速的进入 Android 游戏开发)
  13. 柳夜熙又更新了,虚拟人的底层技术是什么?
  14. windows 2000 密钥
  15. twitter跳过手机验证_安卓怎么注册推特账号(twitter跳过手机验证)
  16. app中使用企业微信sdk分享小程序报错:小程序路径错误,加载超时 解决办法。
  17. 年度十佳电商网站设计赏析
  18. git 报错fatal: cannot create directory at ‘../../..‘: Permission denied
  19. R语言中的apply函数族
  20. Python对数据进行量纲化处理

热门文章

  1. Sleutel:密码治理器
  2. rsync、scp “tab” 卡顿问题
  3. E: Sub-process /usr/bin/dpkg returned an error code (1)
  4. 解决vim打开之后乱码的问题
  5. find命令使用案例
  6. iBatis下使用like查询,以及需要注意的问题
  7. iOS开发中常见的一些异常
  8. 关于出现Not an editor command: Bundle ‘**/*.vim‘的解决方案【转】
  9. golang中包互相引用的解决方法
  10. 解决 el-autocomplete 不显示及没数据时闪一下的问题