美文网首页
static关键字

static关键字

作者: _gentle | 来源:发表于2018-08-14 17:55 被阅读0次

    一、面向过程设计中的static

    1、静态全局变量

    在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。全局变量和静态全局变量的差别在于,全局变量具有外部链接性、而静态全局变量只具备内部链接性。
    例如,在文件a.cpp中定义静态全局变量 i 和全局变量 j :

    #include<iostream>
    using namespace std;
    static int i = 1;
    int j = 2;//默认为extern
    

    全局变量 j 和静态变量 i 都存放于程序的全局数据区域,它们的生存周期都是程序的整个运行期,但是 j 的作用域为全局作用域,可以通过extern在其他文件中使用,而 i 的作用域为文件作用域,只能在文件a.cpp中使用,在工程下的另一个文件b.cpp中(注意不是在a.cpp中include该文件)

    extern int j; //OK
    extern int i; // error: i在文件B中不可见
    
    2、静态全局函数

    与静态变量类似,当全局函数申明为static的时候,该函数就只具备内部链接性,对外不可见
    例如,在a.cpp中

    #include<iostream>
    using namespace std;
    static void f() { //静态全局
        cout << "a.cpp" << endl;
    }
    void f2() {
        cout << "a.cpp" << endl;
    }
    

    在工程下的另一个文件b.cpp中

    #include<iostream>
    using namespace std;
    extern void f();//error
    extern void f2();//ok
    int main() {
        f();
        f2();
    }
    
    3、静态局部变量

    局部变量声明为static时,其作用域为声明该变量的作用域内。且只定义一次,存储在全局数据区。

    #include<iostream>
    using namespace std;
    void f() {
        static int a = 1;
        a++;
        cout << a << endl;
    }
    int main() {
        f();//2
        f();//3
    }
    
    总结:

    在面向过程中的static关键字的功能:
    1.隐藏。当你想将全局变量/函数对工程内的其他文件(translation unit)不可见,以避免冲突时,就将它声明为static的
    2.重复使用一个局部变量,但又不想该变量为全局变量时,可以将其设置为局部静态变量

    二、面向对象的static关键字

    1.静态成员变量

    用static修饰的成员变量为静态成员变量,静态成员变量为类的所有实例所共用,跟函数一样必须在类的实现文件中进行定义

    //a.h
    #include<iostream>
    class A {
    public:
        static int a;
    };
    //int A::a = 1; //error
    
    //a.cpp
    #include "a.h"
    int A::a;//ok
    

    2.静态成员函数

    • 静态成员函数也为类的所有实例共享。
    • 在实现静态成员函数时,可以不用再次声明为静态的。
    • 静态成员函数内部不可以调用非静态成员,因为没有this指针。
      (顺便一提,MSVC不允许静态成员函数有默认参数)
    //a.h
    #include<iostream>
    using namespace std;
    class A {
    public:
        static void  f();
    };
    //void A::f() {//ok
    //  cout << "a" << endl;
    //}
    
    #include "a.h"
    using namespace std;
    void A::f() {
        cout << "a" << endl;
    }
    

    相关文章

      网友评论

          本文标题:static关键字

          本文链接:https://www.haomeiwen.com/subject/icysbftx.html