zoukankan      html  css  js  c++  java
  • 小议 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 

  • 相关阅读:
    代码对齐[UVA1593]
    数数字
    子序列
    细菌培养
    内联函数那些事情
    一个简单的问题
    头文件重复包含问题的一点笔记
    mapreduce 对文件分词读取
    hadoop hive-2.3.5安装
    hadoop sqoop 实例
  • 原文地址:https://www.cnblogs.com/10jschen/p/2650150.html
Copyright © 2011-2022 走看看