小议 static 关键字

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

file1.c

  1. #include <stdio.h>  
  2. static int i = 0;  

file2.c

  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 ->

  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; 其实只起到声明作用 .只是告诉你这里面有这个符号而已. 没有起到赋值作用. 

看下面的程序:

  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.   
  13. int main(int argc, const char *argv[])   
  14. {  
  15.     int k = 0;  
  16.     for (; k<10; k++) {  
  17.         test();  
  18.         test2();  
  19.     }     
  20.     return 0;  
  21. }  


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

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

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

5.静态成员函数

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

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


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

原文地址:https://www.cnblogs.com/10jschen/p/2650150.html