1.静态全局变量: 只作用域本文件,其它文件extern也不行

file1.c

[cpp] view plaincopyprint?
  1. #include <stdio.h>
  2. static int i = 0;

file2.c

[cpp] view plaincopyprint?
  1. #include <stdio.h>
  2. extern int i;
  3. int main(int argc, const char *argv[])
  4. {
  5. printf("%d\n", i);
  6. return 0;
  7. }

gcc *.c ->

[cpp] view plaincopyprint?
  1. ./tmp/ccftYQ26.o: In function `main':
  2. w2.c:(.text+0xb): undefined reference to `i'
  3. collect2: ld returned 1 exit status
  4. /#

2.静态局部变量

由于static定义或声明的变量存储在内存的静态区, 而不是存储在栈中, 所以出了这个作用域后

{

static int i = 1;

i++;

}

变量i不会销毁, 再次进入也不会被重新定义,而是使用原来的值,不过这个作用域是局部的.也就是在其它作用域定义个静态i , 和 第一个静态i 不是同一块内存.

这里有点要注意,再次进入这个作用域, static int i = 1; 其实只起到声明作用 .只是告诉你这里面有这个符号而已. 没有起到赋值作用.

看下面的程序:

[cpp] view plaincopyprint?
  1. static int j ;
  2. void test() {
  3. static int i = 1; //相当于声明
  4. i++;
  5. printf("i=%d\n", i);
  6. }
  7. void test2() {
  8. j = 0;    //每次进入这个作用域 都会被重新赋值下
  9. j++;
  10. printf("j=%d\n", j);
  11. }
  12. int main(int argc, const char *argv[])
  13. {
  14. int k = 0;
  15. for (; k<10; k++) {
  16. test();
  17. test2();
  18. }
  19. return 0;
  20. }

3.修饰函数, 修饰函数不同于修饰变量, 有一点相同就是, 只作用域本文件, 和存储方式无关(静态存储区). 这个作用很大, 和 C++的namespace作用相当!

4. C++ 修饰成员变量, 所有对象共享静态成员

[cpp] view plaincopyprint?
  1. class Test {
  2. public:
  3. Test(int j, int k);
  4. void GetI() { cout<<i<<endl; }
  5. private:
  6. int j, k;
  7. static int i; //静态成员,非全局的
  8. };
  9. int Test::i = 0;
  10. Test::Test(int j, int k) {
  11. this->j = j;
  12. this->k = k;
  13. i = j + k;
  14. }
  15. int main(int argc, const char *argv[])
  16. {
  17. Test a(1, 2);
  18. a.GetI();
  19. Test b(2, 3);
  20. b.GetI();
  21. a.GetI();
  22. return 0;
  23. }

5.静态成员函数

静态成员函数不能调用非静态成员, 因为它没有this ,非静态成员需要对象才能调用.  正因为没有this,所以速度上有少许的增长, 当然静态成员函数也是可以用对象来调用的.

[cpp] view plaincopyprint?
  1. class Test {
  2. public:
  3. Test(int j, int k);
  4. static void GetI() { cout<<i<<endl; }
  5. static void test() ;
  6. private:
  7. int j, k;
  8. static int i;
  9. };
  10. int Test::i = 0;
  11. Test::Test(int j, int k) {
  12. this->j = j;
  13. this->k = k;
  14. i = j + k;
  15. }
  16. void Test::test() {
  17. GetI();
  18. }
  19. int main(int argc, const char *argv[])
  20. {
  21. Test a(1,2);
  22. a.test();
  23. Test::test();
  24. return 0;
  25. }

6.默认初始化为0 , 由于存储在静态区包括全局变量, 会默认初始化为0

转载于:https://www.cnblogs.com/10jschen/archive/2012/08/22/2650150.html

小议 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,即静态的,那就是说无需本类的对象就可以调用此方法.调用一个静态方法就是 "类名.方法名" ,静 ...

最新文章

  1. vue 源码学习(二) 实例初始化和挂载过程
  2. python数据怎么用不了_为什么自学Python看不进去?
  3. Spring IoC 源码系列(四)bean创建流程与循环依赖问题分析
  4. 职场潜规则:领导常说的10句话,学会3句以上你不会混的太差!
  5. 封装一个jquery库
  6. RedisTemplate value序列化导致的问题
  7. Snabbdom(虚拟dom-5-patch函数)
  8. vue.js下载安装教程
  9. css3直线运动_纯css3动画--边框线条动画
  10. 计算机设计大赛一人能报几个,我校在中国大学生计算机设计大赛获多个奖项
  11. python 简单爬虫获取气象数据发送气象定时报-预报预警信息及时推送及阿里云短信群发接口...
  12. SGG前台项目复习笔记
  13. android开发方法数,Android方法数methods超过65536详解
  14. 周易六十四卦——同人卦
  15. 关于Unity中的NGUI优化,你可能遇到这些问题
  16. 实现线程同步的几种方法
  17. eclipse 同时打开两个
  18. java datetime转int_java日期int和String互转
  19. 如何使用gcore以及viewcore排查问题
  20. localhost是什么?

热门文章

  1. python怎么定义文档的行数_python删除文本中行数标签的方法
  2. linux su和sudo命令的区别
  3. 装饰模式与代理模式的区别
  4. Camel 组件之 Timer
  5. CATALINA_BASE与CATALINA_HOME的区别
  6. 572. Subtree of Another Tree
  7. Vmware虚拟机中CentOS7与Docker安装图文教程
  8. 四、MyBatis-映射文件
  9. Gym 101194D Ice Cream Tower
  10. 412. Fizz Buzz