转自 华山大师兄 http://www.cnblogs.com/biyeymyhjob/archive/2012/07/19/2598815.html

题外一句,利用extern使用别的CPP文件的全局变量^_^

1.先来介绍它的第一条也是最重要的一条:隐藏。(static函数,static变量均可)

当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。
举例来说明。同时编译两个源文件,一个是a.c,另一个是main.c。

//a.c
char a = 'A';               // global variable
void msg()
{printf("Hello\n");
}

//main.cint main()
{extern char a;       // extern variable must be declared before useprintf("%c ", a);(void)msg();return 0;
}

程序的运行结果是:

A Hello

为什么在a.c中定义的全局变量a和函数msg能在main.c中使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。
如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏.

2.static的第二个作用是保持变量内容的持久。(static变量中的记忆功能和全局生存期)

存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见

PS:如果作为static局部变量在函数内定义,它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

程序举例:

#include <stdio.h>int fun(){static int count = 10;       //在第一次进入这个函数的时候,变量a被初始化为10!并接着自减1,以后每次进入该函数,areturn count--;              //就不会被再次初始化了,仅进行自减1的操作;在static发明前,要达到同样的功能,则只能使用全局变量:    }int count = 1;int main(void)
{printf("global\t\tlocal static\n");for(; count <= 10; ++count)printf("%d\t\t%d\n", count, fun());return 0;
}

程序的运行结果是:

global  local static

1 10

2 9

3 8

4 7

5 6

6 5

7 4

8 3

9 2

10 1

 ---基于以上两点可以得出一个结论:把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。

3.static的第三个作用是默认初始化为0(static变量)

其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。如果定义成静态的,就省去了一开始置0的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加‘\0’;太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是‘\0’;不妨做个小实验验证一下。

#include <stdio.h>int a;int main()
{int i;static char str[10];printf("integer: %d; string: (begin)%s(end)", a, str);return 0;
}

程序的运行结果是:

integer: 0; string: (begin) (end)

最后对static的三条作用做一句话总结。首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0.

4.static的第四个作用:C++中的类成员声明static(有些地方与以上作用重叠)

在类中声明static变量或者函数时,初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员,这样就出现以下作用:

(1)类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致 了它仅能访问类的静态数据和静态成员函数。

(2)不能将静态成员函数定义为虚函数。

(3)由于静态成员声明于类中,操作于其外,所以对其取地址操作,就多少有些特殊 ,变量地址是指向其数据类型的指针 ,函数地址类型是一个“nonmember函数指针”。

(4)由于静态成员函数没有this指针,所以就差不多等同于nonmember函数,结果就 产生了一个意想不到的好处:成为一个callback函数,使得我们得以将C++和C-based X W indow系统结合,同时也成功的应用于线程函数身上。 (这条没遇见过)

(5)static并没有增加程序的时空开销,相反她还缩短了子类对父类静态成员的访问 时间,节省了子类的内存空间。

(6)静态数据成员在<定义或说明>时前面加关键字static。

(7)静态数据成员是静态存储的,所以必须对它进行初始化。 (程序员手动初始化,否则编译时一般不会报错,但是在Link时会报错误)

(8)静态成员初始化与一般数据成员初始化不同:

初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆;
初始化时不加该成员的访问权限控制符private,public等;        
初始化时使用作用域运算符来标明它所属类;
           所以我们得出静态数据成员初始化的格式:
<数据类型><类名>::<静态数据成员名>=<值>

(9)为了防止父类的影响,可以在子类定义一个与父类相同的静态变量,以屏蔽父类的影响。这里有一点需要注意:我们说静态成员为父类和子类共享,但我们有重复定义了静态成员,这会不会引起错误呢?不会,我们的编译器采用了一种绝妙的手法:name-mangling 用以生成唯一的标志

转载于:https://www.cnblogs.com/gaohai/p/6801116.html

static关键字作用总结相关推荐

  1. C++中static关键字作用总结

    from:https://www.cnblogs.com/songdanzju/p/7422380.html 1.先来介绍它的第一条也是最重要的一条:隐藏.(static函数,static变量均可) ...

  2. C++ static关键字作用讲解

    一.隐藏作用 指的是加static关键字的变量只在源文件cpp中起作用,无法在其中文件中被调用. 举例来说明: 分别创建两个cpp文件.一个是main函数所处的cpp 一个是自己定义的demo.cpp ...

  3. java static关键字_Java基础:static关键字作用总结

    前言 之前讲到final关键字的作用是每次面试的时候我必问求职者的两个问题之一,另外一个问题就是文本会写到的static.final和static一样,都是一个小问题可以看到一个人的基础是否扎实以及平 ...

  4. java 释放static_JAVA中的static关键字作用与用法

    static关键字: 一.特点: 1.static是一个修饰符,用于修饰成员.(成员变量,成员函数)static修饰的成员变量称之为静态变量或类变量. 2.static修饰的成员被所有的对象共享. 3 ...

  5. static 关键字作用

    static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static ...

  6. C++中static关键字作用

    1.对于函数定义和代码块之外的变量声明,static修改标识符的链接属性,由默认的external变为internal,作用域和存储类型不改变,这些符号只能在声明它们的源文件中访问. 2.对于代码块内 ...

  7. static、const、volatile等关键字作用

    目录 一.需要明白c语言中对象的一些属性 1.C语言中内存分配 2.变量的作用域 3.链接属性 4.存储期 二.static.const.volatile关键字作用 1.static关键字作用 2.c ...

  8. C语言中static关键字和break/continue在for/while循环中的作用

    前言 此篇博客对C语言的基础知识稍加总结,包括C语言中的static关键字作用,三大循环语句中出现的break和continue对循环体的影响,常量,生命周期,作用域,字符串,转义字符等等,其中常见的 ...

  9. C++ static关键字总结

    static关键字 static关键字作用 隐藏 全局生存期 默认初始化为0 static变量的初始化时间 成员函数内定义static变量(不安全,各对象之间共享) static关键字作用 隐藏 先来 ...

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

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

最新文章

  1. linux文件类型为ext4怎么扩展,如何扩展ext4分区和文件系统?
  2. 怎样将项目上传到github上
  3. 新手入门深度学习 | 2-4:时间序列数据建模流程示例
  4. python环境下neo4j的安装与使用
  5. boost::sort模块实现使用不区分大小写的字符串键对结构进行排序的示例
  6. lin通讯从节点同步间隔场_汽车行业必须知识--CAN FD通讯
  7. 至诚学院MATLAB第四次,MATLAB 第二次实验课课堂作业(4学时)
  8. 数学老师从没这么教过,乘法竖式中进位可以是多位(附Python实现与测试源码)...
  9. MPLS virtual private network中MCE介绍
  10. 2021-07-26 NLP词嵌入
  11. 电动机效率 matlab,【原创】matplotlib绘制电机效率MAP图
  12. 鸿蒙os系统使用技巧,鸿蒙OS 应用权限管理
  13. Android实现选择相册图片---类似微信的选择图片页面
  14. android 记录打印文件
  15. 树莓派wifi连接不上咋回事
  16. PHP拼团人数不能超过,怎么解决拼团、抽奖难以凑齐人数这个大问题?
  17. 《组织能力的杨三角》——企业持续成功的秘诀(杨国安)读书摘要
  18. Java编写猜单词游戏
  19. 阅读笔记–Java 8函数式编程,建议看书,作者高屋建瓴
  20. Python Level 4 程序题:输入两个整数,倒序输出

热门文章

  1. 十面阿里,屌丝程序员的逆袭之路
  2. 17届互联网校招薪酬报告:白菜价22W,青菜价30W,神价150W
  3. 人生苦短,我用 Chrome!
  4. Studio系列教程来啦
  5. 线程 -- ThreadLocal
  6. JPA 系列教程14-自定义类型-@Embedded+@Embeddable
  7. ORB:新一代 Linux 应用
  8. php的json_encode函数问题
  9. 顶点计划:520日讨论
  10. Python接口自动化实战(第二阶段)- unittest框架