zoukankan      html  css  js  c++  java
  • 【C++自我精讲】基础系列四 static

    【C++自我精讲】基础系列四 static
    0 前言

    变量的存储类型:存储类型按变量的生存期划分,分动态存储方式和静态存储方式。

     1)动态存储方式的变量,生存期为变量所在的作用域。即程序运行到此变量时才为其分配存储空间,作用域结束时,会自动收回为其分配的存储空间。

     2)静态存储方式的变量,生存期为整个程序执行的过程。即程序开始时就为其分配存储空间,程序结束时,才会收回为其分配的存储空间。

    4种变量的存储类型:

     1)自动类型(auto):动态存储方式的变量,局部变量,auto常常省略。

     2)寄存器类型变量(register):动态存储方式的变量,编译器不为此类型变量分配存储空间,而是直接使用CPU的寄存器。存取速度快,主要用于控制循环次数等不需要长期保存值的变量。

     3)外部类型变量(extern):静态存储方式的变量,系统自动初始化值,又叫全局变量,全局变量是从作用域提出的,外部变量是从存储方式提出的,表示了它的生存期。

     4)静态存储变量(static):静态存储方式的变量,系统自动初始化值,静态变量只能在它的作用范围内使用。

    1 static用法

    static:静态存储变量的类型说明符。

    static局部变量:在函数内的局部变量类型说明符前加上static说明符就构成静态局部变量。局部变量变为静态局部变量,即改变了它的生存期。

    void Fun()
    {
        static int i; //static局部变量
        ...
    }

     1)static局部变量在函数内定义。

     2)static局部变量的生存期是整个程序。

     3)static局部变量的作用域为函数体内。但再次调用定义此函数时,又可继续使用此变量,而且保存了前次被调用后留下的值。

    int Fun1()
    {
        int i = 0;    //局部变量
        i++;
        return i;
    }
    int Fun2()
    {
        static int i; //static局部变量
        i++;
        return i;
    }
    int main(int argc, char* argv[])
    {
        int iRet = 0;
        iRet = Fun1();  //iRet = 1;
        iRet = Fun1();  //iRet = 1;
        iRet = Fun2();  //iRet = 1;
        iRet = Fun2();  //iRet = 2;
        return 0;
    }

    static全局变量:在全局变量类型说明符前加上static就构成静态的全局变量。全局变量变成静态全局变量,即改变了它的作用域。

     1)当一个源程序由若干个源文件组成时,在一个源文件中定义的外部变量要在其它的源文件中使用,在使用前就用extern进行外部声明。

     2)如果在一个源文件中定义的外部变量不想让其它源文件使用,则必须声明为static全局变量,只能供所在的源文件使用。同时可以避免在其它源文件中引起错误。

    //全局变量
    file1.cpp
    int gNum;
    main() 
    {
        gNum++;
    }
    
    file2.cpp
    extern int gNum;  
    main() 
    {
        gNum++;
    }
    
    //static全局变量
    file3.cpp
    static int gNum;  
    main() 
    {
        gNum++;
    }

     static类成员变量:类的所有对象都用同一个static成员变量。通过对象名或类名都可以调用。

    class A
    {
    public:
      static int x;
      int y;
    };
     
    A a1,a2;   //创建了两个A的对象
    a1.x = 1;  //A::x = 1;或a2.x = 1;一样,都是对static int x;操作,x = 1;
    a1.y = 1;  //a1对象里面y = 1;
    a2.y = 2;  //a2对象里面y = 2;

     static类成员变量和普通数据成员一样,不能在类的定义体中初始化,只能在类外进行初始化。但static const却可以。

    int y = 200;
    class A
    {
    public:
      static const int x = 100;
      static int y;
    };

    static类成员函数:类的所有对象都用同一个static成员函数。通过对象名或类名都可以调用。

     1)static类成员函数没有this指针。

     2)static类成员函数不能被声明为const和虚函数。

     3)static类成员函数可以访问所属类的static成员变量,但不能使用非static成员变量。

    class A
    {
    public:
      static int x;
      int y;
      static void Fun();  //static成员函数
    };
    static void Fun()
    {
        x++;  //可以
        y++;  //不可以
    }
    
    A a1;
    a1.Fun(); //或A::fun();
  • 相关阅读:
    <p>1、查询端口号占用,根据端口查看进程信息</p>
    CentOS查询端口占用和清除端口占用的程序
    Spring Boot Maven 打包可执行Jar文件!
    linux下运行jar
    maven 工程mybatis自动生成实体类
    java反射教程
    SQL Server 文件和文件组
    Angular CLI 使用教程指南参考
    mac osx 下 浏览器 开启 java
    es 查询分词字段为空的数据
  • 原文地址:https://www.cnblogs.com/joinclear/p/3182914.html
Copyright © 2011-2022 走看看