• C++
  • 【C++】C++关键字-static介绍学习笔记教程

  • @ 2025-8-11 13:19:39

1 条评论

  • @ 2025-8-11 13:19:48

    C++关键字-static学习笔记

    一、static关键字的基本作用

    static是C++中一个多功能的关键字,其核心作用是改变变量或函数的存储方式、作用域或生命周期。根据使用场景的不同,static的具体含义和效果会有所差异。

    二、静态局部变量(在函数内部使用)

    在函数内部声明的变量前加上static,该变量就成为静态局部变量。

    特点:

    • 生命周期:从第一次函数调用时初始化,直到程序结束才销毁(普通局部变量在函数调用结束后销毁)。
    • 作用域:仅在声明它的函数内部可见。
    • 初始化:只初始化一次,后续函数调用会保留上次的值。

    示例代码:

    #include <iostream>
    using namespace std;
    
    int count() {
        static int num = 0; // 静态局部变量
        num++;
        return num;
    }
    
    int main() {
        cout << count() << endl; // 输出1
        cout << count() << endl; // 输出2
        cout << count() << endl; // 输出3
        return 0;
    }
    

    应用场景:

    • 记录函数被调用的次数。
    • 实现单例模式(确保某个类只有一个实例)。

    三、静态全局变量(在文件作用域声明)

    在全局变量前加上static,该变量就成为静态全局变量。

    特点:

    • 作用域:仅在当前文件中可见(普通全局变量可以被其他文件通过extern引用)。
    • 生命周期:从程序开始到程序结束。

    示例代码:

    // file1.cpp
    static int g_val = 10; // 静态全局变量,仅在file1.cpp中可见
    
    // file2.cpp
    extern int g_val; // 错误,无法引用file1.cpp中的静态全局变量
    

    应用场景:

    • 避免不同文件中的全局变量重名冲突。
    • 限制变量的作用域,提高代码的封装性。

    四、静态成员变量(在类中声明)

    在类的成员变量前加上static,该变量就成为静态成员变量。

    特点:

    • 存储方式:不属于类的任何实例,而是属于整个类,所有实例共享同一份数据。
    • 初始化:必须在类外进行初始化(语法:数据类型 类名::变量名 = 初始值;)。
    • 访问方式:可以通过类名::变量名对象.变量名访问(需要满足访问权限)。

    示例代码:

    #include <iostream>
    using namespace std;
    
    class Student {
    public:
        static int total; // 静态成员变量,记录学生总数
        string name;
    };
    
    // 类外初始化静态成员变量
    int Student::total = 0;
    
    int main() {
        Student s1;
        s1.name = "张三";
        Student::total++; // 通过类名访问
    
        Student s2;
        s2.name = "李四";
        s2.total++; // 通过对象访问
    
        cout << "学生总数:" << Student::total << endl; // 输出2
        return 0;
    }
    

    应用场景:

    • 存储类级别的共享数据(如统计类的实例数量)。

    五、静态成员函数(在类中声明)

    在类的成员函数前加上static,该函数就成为静态成员函数。

    特点:

    • 调用方式:属于整个类,可以通过类名::函数名对象.函数名调用(需要满足访问权限)。
    • 访问限制:只能访问类的静态成员变量和静态成员函数,不能访问非静态成员变量和非静态成员函数(因为没有this指针)。
    • 生命周期:不属于任何实例,和类的生命周期一致。

    示例代码:

    #include <iostream>
    using namespace std;
    
    class MathUtil {
    public:
        // 静态成员函数,计算两个数的和
        static int add(int a, int b) {
            return a + b;
        }
    };
    
    int main() {
        int sum1 = MathUtil::add(3, 5); // 通过类名调用
        MathUtil mu;
        int sum2 = mu.add(2, 7); // 通过对象调用
        cout << sum1 << " " << sum2 << endl; // 输出8 9
        return 0;
    }
    

    应用场景:

    • 实现工具类函数(如数学计算、数据转换等,不需要访问类的实例数据)。
    • 管理静态成员变量(如提供修改或获取静态成员变量的接口)。

    六、总结:static在不同场景的作用对比

    使用场景 核心作用 生命周期 作用域
    静态局部变量 延长局部变量的生命周期 从第一次初始化到程序结束 所在函数内部
    静态全局变量 限制全局变量的作用域 从程序开始到程序结束 所在文件内部
    静态成员变量 实现类级别的共享数据 类内部(通过类或对象访问)
    静态成员函数 实现类级别的工具函数,不依赖实例数据

    通过合理使用static关键字,可以提高代码的封装性、减少命名冲突,并实现一些特殊的功能(如单例模式、工具类等)。但需注意避免过度使用,以免增加代码的复杂度和耦合性。

    • 1