static 是静态变量的类型说明符.

static修饰局部变量----静态局部变量

static 修饰的局部变量属于静态存储方式.
static修饰局部变量,改变了该变量的生命周期,使该变量的生命周期与程序的生命周期相同,程序结束时才销毁.
以代码为例,体会static修饰局部变量的作用:

#include<iostream>
void A1() {static int tmp = 1;static int tmp1;int ret = 1;std::cout <<"tmp:"<< tmp <<'-'<<"ret:"<< ret << std::endl;tmp++;tmp1++;ret++;
}
int main() {A1();// 每次调用该函数时, 静态局部还保留着之前的值,说明之初始化了一次A1();return 0;
}

代码执行结果:

  • 0
    tmp:1-ret:1
    1
    tmp:2-ret:1

特点:

  • static修饰局部变量,改变了该变量的生命周期,它的生命周期与程序的生命周期相同,但是其作用域未改变仍与局部变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
  • 对基本类型的静态局部变量若在声明时未赋以初值,则系统自动赋予0值。而对局部变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以 看出它是一种生存期为整个源程序的变量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成 意外的副作用,因此仍以采用局部静态变量为宜。

static修饰全局变量----静态全局变量

限定了该变量的作用域,使其只在定义该变量的源文件内有效,非静态全局变量的作用域是定义该变量的整个工程.

static int tmp;
  • 全局变量(外部变量)的说明之前再加上static 就构 成了静态的全局变量。静态全局变量与非静态全局变量在存储方式上都是静态存储方式。这两者的区别虽在于非静态全局变量的作用域是定义该变量的整个工程项目, 当一个工程项目由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的.静态全局变量的作用域是定义该变量的源文件 只在定义该变量的源文件内有效,在同一工程项目的其它源文件中不能使用它.由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此 可以避免在其它源文件中引起错误。从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量 后是改变了它的作用域, 限制了它的使用范围。

static修饰不在类中的函数----静态函数

C语言根据函数能否被其它源文件中的函数调用,将函数分为内部函数和外部函数。

  • 内部函数: 当一个源程序由多个源文件组成时, 如果在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,这种函数称为内部函数。
// static 函数类型 函数名(参数列表)
static void Function(int a, char b,...)
  • 外部函数: 在定义函数时,如果没有加关键字“static”,或加上关键字extern 修饰,表示此函数是外部函数.
    外部函数的调用:
// extern 函数类型 函数名 (参数类型表)
extern int Function(int);

静态函数有以下好处:
  <1> 其他文件中可以定义相同名字的函数,不会发生冲突。
  <2> 静态函数不能被其他文件所用。

static修饰类中的函数----静态成员函数

静态成员函数的作用: 调用这个函数不会访问或者修改任何对象(非静态)数据成员。
类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。

注意:

  • 静态数据成员不能在类中初始化,实际上类定义只是在描述对象的蓝图,在其中指定初值是不允许的,但是可以在类定义中可以定义静态的常量数据成员,并且初始化(比如: static const int tt =10 ;)。
  • 如果在类定义中初始化了静态常量数据成员,就不可以在类定义外,初始化该成员了,因为不能初始化多次。
  • 不能在构造函数中初始化常量静态成员数据。因为静态数据成员为类的各个对象共享,否则每次创建一个类的对象则静态数据成员都要被重新初始化。只能在类定义外初始化静态成员数据。 并且只能定义一次。static数据成员在构造函数被调用之前就已经存在了。
  • 静态成员可以是public也可以是private或者是protected,静态数据成员的类型可以是常量、引用、指针、类类型等 。
  • 静态成员函数没有this形参,可以直接访问所属类的static 成员, 但不能直接使用所属类的非static 成员。
  • 静态成员不能声明为const 的。
  • 静态数据成员被 类 的所有对象所共享,包括该类派生类的对象。即派生类对象与基类对象共享基类的静态数据成员。
class Student
{public:static int getCount();  static int count;void outPutAge(int data = age)  定义个成员函数,static数据成员可以作为默认参数{cout << data << endl;}void outPutSex(bool s = sex) 错误: 类的普通数据成员不能作为默认参数{}Student myStudent1;  错误,非static数据成员不能定义为所属类的对象static Student myStudent2; static 数据成员可以是当前类的类型Student *myStudent3; 正确, 允许定义类的所属类型的指针类型对象static Student &myStudent4();private:bool sex;static int age;
};
int Student::age = 1;  在类外初始化私有的static数据,要添加 类名::
int Student::getCount()  在类外定义static 函数不需要添加static
{return count; 在类的内部使用static 数据成员,不需要使用类名::
}
int main()
{Student myStudent;Student::count = 1;  利用作用域运算符在类外使用类名初始化公有的static数据int temp = Student::getCount(); 调用静态成员函数myStudent.count = 2; 使用点运算符还可以使用该类的对象初始化公有的static数据Student::age = 2; 错误: 在类外不能初始化 私有static数据Student *s = &myStudent; 声明一个指针指向该类型对象, 间接调用成员s->getCount();  通过指针调用static 成员函数s->count; 指针调用公有的static数据成员Student &ss = myStudent;ss.getCount();ss.count;system("pause");return 0;
}

一个类的静态数据成员仅创建和初始化一次,且在程序开始执行时创建, 然后被该类的所有对象共享。
静态数据成员可以被所有类的对象共享。这就意味着无论定义多少个类对象, 每个类的只有一个静态数据成员的拷贝。

static变量总结相关推荐

  1. 局部变量和static变量

    局部变量:指在程序中,只在特定过程或函数中可以访问的变量,是相对于全局变量而言的.在C++.C#.Ruby这些面向对象语言中,一般只使用局部变量.在面向对象编程中现在普遍采用的是软件开发方法,因此无需 ...

  2. 一种安全的static变量Get/Set方式

    目的:避免static变量是个文件内可见的全局变量 Get: std::atomic<bool>* GetGraphVerboseStepLr() {static std::atomic& ...

  3. (转)static 变量

    一. static 变量 static变量大致分为三种用法 1. 用于局部变量中,成为静态局部变量. 静态局部变量有两个用法,记忆功能和全局生存期. 2. 用于全局变量,主要作用是限制此全局变量被其他 ...

  4. springboot下Static变量通过@Value和set方法注入失败的问题和解决办法

    首先static变量是不能直接使用@value进行注入. 但是也不是没有办法.操作如下: 1.在这个变量的类上标上注解@Component 2.通过set方法就可以,给在set方法上使用@Value注 ...

  5. java static变量销毁_JAVA里static 变量在程序执行结束后是否被消毁

    static变量是属于类的,一般情况下,程序执行结束后,类所占空间会被回收, static变量自然就被销毁了. 如下所示: public class StaticVar{ public static ...

  6. 关于static变量,请选择下面所有说法正确的内容

    若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度 若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度 设计和使用访问动态 ...

  7. inline函数包涵static变量,调用时是否会有多份拷贝

    inline   int   static_test() {       static   int   i   =0;       ... } inline   代表编译时代码拷贝,也就有多份副本了, ...

  8. c语言中的static变量和static函数

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

  9. UNITY编辑器模式下static变量的坑

    UNITY编辑器模式下static变量的坑 在unity中写编辑器扩展工具,如在编辑器中加个菜单,点击这个菜单项时执行打包功能. 类如下,其中的静态变量,如果每次进来不清空,则LIST会越来越大,打包 ...

  10. 谨慎Asp.net中static变量的用法

    谨慎Asp.net中static变量的用法 .Net技术 2007-01-30 22:17:37 阅读925 评论11 字号:大中小 谨慎Asp.net中static变量的用法 在.Net平台下进行C ...

最新文章

  1. 获取SQLServer数据库中所有表
  2. 洛谷P1074 靶形数独(跳舞链)
  3. java面试总结-(hibernate ibatis struts2 spring)
  4. 标准库类型String,Vector
  5. java asm tree_使用ASM 4处理Java类文件–第二部分:Tree API
  6. Iphone屏幕旋转
  7. ajax请求数据 ztree_ajax 异步获取数据填充到表格显示(ajax) 文档(Options API) DataTables中文网...
  8. LinuxCentos7 防火墙开放端口,查看状态,查看开放端口
  9. Windows 编程[11] - WM_SIZE 消息
  10. c语言期终试卷,谁有c语言的往年期中试卷么
  11. java 动态爱心代码_java swing实现动态心形图案的代码下载
  12. spring boot 2 整合 j2Cache
  13. d3d示例程序_3D打印改变我们现实的10个示例
  14. Echarts柱状图和折线图结合
  15. python爬取招聘网站的选题背景_Python爬虫爬取智联招聘(进阶版)
  16. Python汉字转拼音(xpinyin)
  17. Windows系统文件详解
  18. SQL中查询MySQL的版本
  19. 彻底关闭烦人的FF新推荐
  20. 广州校园速递 | [线上分享会] 香港科技大学2.0: 广州新校园筹备概况

热门文章

  1. Oracle12C安装记录
  2. 大运新城14号线坳背站坳二村片区城市更新单元旧改回迁房项目
  3. 12306自动刷票下单-登录篇
  4. No2.大话设计模式学习之策略、装饰、代理模式
  5. 谁在纵容币圈乱象“李笑来”们?
  6. java.lang.NoSuchMethodError: javax.persistence.OneToOne.orphanRemoval()Z at
  7. parseInt深度探究
  8. hexo+yilia添加版权声明
  9. flutter 加载框
  10. rtsp协议报文解析-首部字段解析