C++中提供了关键字static供我们使用,这个关键字可以用来修饰全局变量、局部变量、成员变量、成员方法和函数。它主要起到的作用是:限制被修饰的数据的作用域、生命周期。

static的作用域

作用域是指static所修饰的这个变量或者是函数是在哪个地方,例如:

(1)  static修饰了全局变量serven,那么这个全局变量只能在这个文件Serven_Test.cpp使用,除了这个文件就失效了。

// Serven_Test1.cpp
#include <iostream>
using namespace std;
​
static int serven;        // 定义了一个静态的全局变量
​
int main()
{serven ++;cout<<serven<<endl;      // 程序运行结果是打印了 1return 0;
}

(2) static在函数fun里面修饰局部变量serven,所以这个静态变量的作用域只局限于函数fun,除了这个函数就失效了,访问不了。

// Serven_Test2.cpp
#include <iostream>
using namespace std;
​
void fun()
{static int serven;        // 定义了一个静态的全局变量serven ++;cout<<serven<<endl;
}
​
int main()
{fun();// cout<<serven<<endl;      // 程序运行结果是打印了 1return 0;
}

利用作用域的特性可以在不同的文件中定义同名变量和同名函数,而不必担心命名冲突。

static的生命周期

生命周期是指,static修饰的变量或者函数在整个程序运行期间都存在,不会被释放掉,被修饰的变量或函数会在main函数之前就已经编译完成,直到程序运行结束后才会被释放。

static的共享性

共享性是指,变量定义后会在编译阶段编译好了,运行时候不会去给这个变量重新分配内存空间。

综合上面举个例子:

下面的代码中,变量serven_1和serven_2被static修饰,两个变量的作用域都在函数里面,可以看到第22行,在main函数中打印这个变量是出错的,但是这个变量又是陪伴这整个程序的生命周期的,当你再次调用Test_Static_1函数时,你会发现serven_1和serven_2的值会累加上去,还有一个特别注意的是,你可以静态变量可以不用初始化,如果没有初始化那么就会默认为0,并且变量会存储到内存区域的bss段;如果变量进行了初始化,那么变量会存储到内存区域的DATA段。为了比较普通的成员变量,我们定义了一个serven_2,在运行阶段调用到这个函数才会在内存的栈区域分配这个变量的区域大小,当调用完这个函数后就会把这个变量释放掉,下次进来再从新分配内存给这个变量。

// Serven_Test.cpp
#include <iostream>
using namespace std;
​
void Test_Staic_1(){
​static int serven;              // 如果不初始化值的话,就会默认初始化为0,该变量没有初始化,那么编译阶段就会存储在内存区域中的BSS段static int serven_1 = 9;          // 如果初始化该值,编译阶段就会将变量存储到内存区域的DATA段。int serven_2 = 1;              // 这是普通的成员变量,是在调用这个函数才会创建的,会存放在内存区域的栈,除了这个函数作用域就弹掉,没用了serven   ++;serven_1 ++;serven_2 ++;cout<<"没有赋初始值:"<<serven<<"  有赋初始值:"<<serven_1<<"  普通成员变量:"<<serven_2<<endl;
​
}
​
void main(){
​for (int i=0;i<5;i++){Test_Staic_1();//cout<<serven<<endl;          // 这里打印就会出错,因为这里已经超出serven的作用域了,serven的作用域只限于Test_Static_Area函数}}

运行结果:

static修饰成员变量

在一个类中,static可以修饰该类的成员变量和成员方法,这些静态成员拥有一块单独的存储区,不管创建了多少个该类对象,所有的对象都共享这一块内存。静态成员本质上属于类,可以通过类名直接访问。还有一点就是静态成员方法只能访问静态成员变量,不能访问非静态成员变量。并且静态成员函数中没有this指针。

在一个团队合作一个项目中,为了避免每个程序员定义的变量冲突到,往往会使用static来修饰变量或者函数。

 关注微信公众号“ 三贝勒文子 ”,每天学习C/C++

C++的static关键字相关推荐

  1. c语言中external,static关键字用法

    static用法: 在C中,static主要定义全局静态变量.定义局部静态变量.定义静态函数. 1.定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量.全局静态变量有 ...

  2. Java 静态变量,静态方法,静态常量(java static 关键字)

    Java 静态变量,静态方法,静态常量  就是变量 ,方法,常量前面添加了static 关键字 为什么要使用静态的呢 有时候在处理问题时会需要两个类在同一个内存区域共享一个数据, 不如现在 Main ...

  3. static关键字用法

    static关键字 1.修饰成员变量 在我们平时的使用当中,static最常用的功能就是修饰类的属性和方法,让他们成为类的成员属性和方法,我们通常将用static修饰的成员称为类成员或者静态成员,这句 ...

  4. Java中的static关键字的用法

    1.静态方法 static:通常在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法 声明为static的方法有以下几条限制: (1)它们仅能调用其他的static方法. (2 ...

  5. java的static关键字

    java的static关键字 静态变量和静态方法 static关键字最基本的用法是: 1.被static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一个类来 2.被static ...

  6. 面试季,Java中的static关键字解析

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面 ...

  7. c++语言static作用,详解c++中的 static 关键字及作用

    注:若没有特指是 静态成员时,默认都是普通成员: 1 类中的普通成员 类中的成员变量 和 成员函数 是分开存储的.其中, 1)每个对象都有独立的成员变量:成员变量可以存储在 栈空间.堆空间.全局数据区 ...

  8. static关键字了解解析

    什么是static关键字 static关键字我们经常接触,不过我们一直没有讨论过它到底是什么,有什么具体的作用,那static关键字是什么呢,有啥用呢? static是静态的意思,是一个修饰符,就像是 ...

  9. Java中的static关键字详解

    ** Java中的static关键字详解 ** 在一个类中定义一个方法为static,即静态的,那就是说无需本类的对象就可以调用此方法.调用一个静态方法就是 "类名.方法名" ,静 ...

  10. C++中的static关键字的总结

    C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用. 1.面向过程设计中的st ...

最新文章

  1. 《计算机网络》常考概念、英文缩写、公式大全
  2. SP-1. 五月学习计划(study plan)
  3. 设计模式(二)之装饰器模式
  4. InnoDB 的辅助索引叶子节点为什么不直接保存的记录地址而要存主键键值
  5. easyUI的combobox实现级联
  6. 如何让NN分类输出[0,1]的值,并且相加等于1
  7. vue3大屏电子数字滚动显示动效
  8. 单例模式中饿汉模式和懒汉模式的线程安全问题
  9. Android原生框架--Xui使用
  10. UGNX1953~1980版本怎么测量重量
  11. Unity FPS 计算
  12. 角度传感器测量实验 GY-25
  13. luogu P1195 口袋的天空
  14. 学习springboot第一天
  15. 感慨颇多:清华差生10年奋斗经历
  16. Unity-黑暗之魂复刻-跳跃功能
  17. Project2019安装步骤
  18. 欧几里得扩展欧几里得
  19. 对称加密的对称密钥分发
  20. nginx配置前端不缓存

热门文章

  1. WIN7系统的字体突然变粗了的原因和解决方法
  2. Thinkpad E440个性化设置:如何/禁用关闭触摸板?
  3. VMware安装winows/linux虚拟机
  4. Object-c 反射技术
  5. Unity资源加载管理
  6. java convert函数_Java 函数式编程和Lambda表达式
  7. 原来,这才是开发者打开世界读书日的正确姿势
  8. java计算机毕业设计Web美食网站设计MyBatis+系统+LW文档+源码+调试部署
  9. 计算机如何添加光盘驱动程序,电脑没有光驱,怎么安装驱动?
  10. win10pro是什么版本