在文章开头先写总结吧,省的文章太长大家看的又晕。简单总结下来static关键字具有以下两点作用:改变变量的生命周期和限定作用域

1、改变变量的生命周期

我们都知道在函数中申明的局部变量在函数调用完成后即会被释放,但是由static申明的局部变量的生存周期是长于函数的,也就是说即使函数调用结束后该变量的内存也不会被释放。下面我们直接看代码:

#include

#include

void func()

{

int i = 1 ;

static int i_static = 1;

i ++ ;

i_static ++ ;

std::cout<

}

int main()

{

std::cout<

func();

std::cout<

func();

system("pause");

}

我们运行起来看结果:

first run:

i:2

i_staic:2

sencond run:

i:2

i_staic:3

这样就很清楚了吧:i是普通局部变量的申明方式,在每次函数调用时都会重新分配内存重新初始化,在函数结束后该内存就会被自动释放。但是static声明的局部变量随着第一次函数的调用而初始化,却不随着函数的调用结束而销毁,而是一直存在直至程序结束。具体原理是什么这个就牵涉到C++程序内存的分配原则了。有兴趣的朋友可以关注小编,下一篇为大家详细讲解。

2、限定作用域

用static申明的变量和函数作用域都仅限本文件。关于限定作用域必须得结合C++的另外一个关键字‘extern’来讲解(修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用。关于extern关键字的作用,关注小编后续为大家分享)。好,废话不多说直接上代码(程序猿就是这样,看代码比看文字舒服多了,嘿嘿)

这里有两个 .Cpp 文件其中a.cpp中代码如下:

#include

int test01 = 10 ;

static int test02 = 11 ;

void func1()

{

std::cout<

}

static void func2()

{

std::cout<

}

在这里定义了两个变量(一个静态一个非静态)和两个函数(一个静态一个非静态),然后再另外一个‘源.cpp’中引用他们,我们看运行结果是什么样的(注意看注释的代码)

using namespace std ;

extern int test01 ;

//extern int test02 ;

extern void func1();

extern void func2();

int main()

{

cout<

//cout<

func1();

//func2();

system("pause");

}

按照现在的代码运行结果是:

10

no static func"

但是当我将注释的代码放开然后编译运行就会报错:

这是因为在extern在寻找test02和func2的时候在a.cpp中被static给屏蔽掉(因为static的作用就是限定test02和func2的作用域只是作用于本文件即a.cpp文件)

好了,现在大家应该对于static的作用已经有了很全面的认识了吧!希望我的分享能够帮助大家,祝大家长发飘飘~~~

java中static关键字的作用_C++ static关键字到底有什么作用相关推荐

  1. 39.在Java中定义一个不做事且没有参数的构造方法的作用?

    1 在Java中定义一个不做事且没有参数的构造方法的作用 Java程序在执行子类的构造方法之前,如果没有用super()来调用父类特定的构造方法,则会 调用父类中"没有参数的构造方法&quo ...

  2. [转载] java中对象作为参数传递给一个方法,到底是值传递,还是引用传递

    参考链接: 用Java传递和返回对象 看完绝对清晰~ java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? pdd:所谓java只有按值传递:基本类型  值传递:引用类型,地址值传递,所 ...

  3. java中main方法前的public static void及其后面的(String[] args)【笔记自用】

    为什么Java的main方法必须是public static void? 一. void 如下,像C, C++一样,将返回值类型改为int,再返回一个0,虽然编译通过,但是运行时会报错. 找到一种可理 ...

  4. java中静态代码块的用法 static用法详解(转)

    (一)java 静态代码块 静态方法区别 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程 ...

  5. java中静态代码块的用法 static用法详解

    (一)java 静态代码块 静态方法区别 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程 ...

  6. java中的标识符和关键字_浅谈java中的标识符、修饰符和关键字

    合法标识符 Java语言中,对于变量,常量,函数,语句块均有名字,我们统统称之为Java标识符.标识符是用来给类.对象.方法.变量.接口和自定义数据类型命名的. 组成:Java标识符由数字,字母和下划 ...

  7. java中finally意思_Java学习之finally关键字总结

    Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使 ...

  8. Java中的覆盖和隐藏以及final关键字

    Java覆盖和隐藏 (1) 变量只能被隐藏(包括静态和非静态),不能被覆盖: (2) 可以用子类的静态变量隐藏父类的静态变量,也可以用子类的非静态变量隐藏父类的静态变量,也可以用非最终变量(final ...

  9. 详细对比java中的 final,finally, finalized关键字

    文章目录 final 1. 修饰类 2 修饰方法 3 修饰变量 finally 1.finally不执行的两种情况 finalize final 在java中,final可以用来修饰类,方法和变量(成 ...

  10. java volatile lock_Java并发学习笔记 -- Java中的Lock、volatile、同步关键字

    Java并发 一.锁 1. 偏向锁 1. 思想背景 来源:HotSpot的作者经过研究发现,大多数情况下,锁不仅不存在多线程竞争,而且总是由同 一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁 ...

最新文章

  1. 【机器视觉】 HDevelop语言基础(二)-变量和表达式
  2. 企业架构 - ADM方法概要介绍
  3. 通过显示当前 python 程序占用的内存大小来比较生成器和迭代器(转载)
  4. 2016-6-28 工作总结
  5. CSS3-06 样式 5
  6. html 中avi视频插件,JDG让一追二击败V5!Kanavi降维打击,逆版本选英雄不按常理出牌...
  7. 后端接口如何提高性能?从MySQL、ES、HBASE等技术一起探讨下!
  8. 我不是bug神(JVM问题排查)
  9. java的获取声音振幅_录音获取声音振幅波形显示
  10. GeoTools使用之JTSFactoryFinder接口
  11. 绘制完成的cad图纸文件应使用哪一款看图软件进行查看?
  12. 2019寒假作业一:PTA7-1 打印沙漏
  13. [JSOI2009]瓶子和燃料
  14. python实验总结与分析_Python实验报告七
  15. 计算机硬盘坏的原因,硬盘损坏的原因有哪些 硬盘正确使用方法介绍
  16. 简单聊聊MD5和SHA-256加密
  17. Visual C++中的AFX前缀
  18. mfc,WM_CTLCOLOR,WM_PAINT
  19. K8S集群应用市场安装部署:第一篇
  20. [论文阅读] Action Semantics Network: Considering the Effects of Actions in Multiagent System

热门文章

  1. Redis复制与可扩展集群搭建
  2. sync Command in Unix
  3. 网站SEO优化--Flash站优化方法
  4. 每个字符旋转随机角度的图象验证码 V2.0
  5. 【Tensorlayer系列】深度强化学习之FrozenLake介绍及表格型Q学习求解
  6. 智能优化算法:足球联赛竞争算法-附代码
  7. 神经网络工具箱——nn.funtional、初始化策略
  8. 计算机网络技术期末应用试卷,中专学校2016年《计算机网络技术与应用》期末考试题(考试卷与答案)...
  9. 简便方法搭建Harbor镜像仓库
  10. BerryBoot实现树莓派多系统切换