【C++自我精讲】根蒂根基系列四 static

    添加时间:2013-7-15 点击量:
    【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();


    原来,再大的房子,再大的床,没有相爱的人陪伴,都只是冰冷的物质。而如果身边有爱人陪伴,即使房子小,床小,也觉得无关紧要,因为这些物质上面有了爱的温度,成了家的元素。—— 何珞《婚房》#书摘#
    分享到: