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. 5.Collection集合 List集合 泛型
  2. java堆与非堆的一些研究_堆和堆傻傻分不清?一文告诉你 Java 集合中「堆」的最佳打开方式...
  3. Google DeepMind围棋程序AlphaGo的分析
  4. wince -- telnet登陆密码的取消
  5. 何时使用JavaFX代替HTML
  6. C++ STL容器值set
  7. stream iterators源代码详解
  8. 转移到ios下载安卓_安卓和IOS角色互转 和平精英跨系统角色转移服务将上线
  9. 30 CO配置-控制-产品成本控制-成本对象控制-期末结算-定义更新
  10. ubuntu网站收集
  11. 毕业设计周记(第二篇)
  12. Android UI学习之EditText
  13. 基于SRP创建自定义渲染管线
  14. iframe透明解决方案
  15. 阿帕奇服务器搭建网站,使用Apache搭建Web网站服务器
  16. mac配置VMware Fusion虚拟机网络配置
  17. 工业4.0,智能制造和大规模定制
  18. ul li文字不对齐
  19. 服务器打补丁重启时候系统掉,服务器自动重启我的服务器windowssever高级版,但每次开 爱问知识人...
  20. 大话西游2人数最多服务器,逆生长!126万玩家再造【大话西游2】“火爆现象”...

热门文章

  1. java 遍历String[]的常用两种方法
  2. k8s之configmap
  3. c#模拟网页实现12306登陆、自动刷票、自动抢票完全篇
  4. 攻防世界misc新手区__掀桌子_题解
  5. 网络协议和Netty(7):常用的网络抓包工具 Wireshark
  6. java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z 两种解决方案
  7. 设置了JOB,但是 不执行
  8. 基于Autoware制作高精地图(三)
  9. 合并百度影音的离线数据 with python
  10. Coreldraw 10设计应用之台历制作(转)