目录

1. 静态局部变量 (Static Local Variables)

2. 静态全局变量 (Static Global Variables)

3. 静态函数 (Static Functions)

4. 类的静态成员 (Static Class Members)

(1) 静态成员变量

(2) 静态成员函数

5. static 的内存分配

6. 总结对比

7. 常见问题

在 C++ 中,static 是一个非常重要的关键字,它可以用来修饰变量、函数以及类成员等,具有多种用途。它的核心作用是控制变量或函数的存储方式作用域

1. 静态局部变量 (Static Local Variables)

  • 定义: 在函数内部用 static 修饰的变量。

  • 特点:

    • 只在第一次调用函数时初始化一次,而不是每次函数调用都重新初始化。

    • 它的生命周期贯穿整个程序运行期间,而不是随着函数调用结束而销毁。

    • 但它的作用域仍然局限于定义它的函数内部。

  • 示例:

    #include <iostream>
    void test() {
        static int count = 0; // 只初始化一次
        count++;
        std::cout << "Count: " << count << std::endl;
    }
    
    int main() {
        test(); // 输出: Count: 1
        test(); // 输出: Count: 2
        test(); // 输出: Count: 3
        return 0;
    }

    解释: count 被声明为 static,所以它在程序运行期间只分配一次内存,后续调用 test() 时会保留之前的值并递增。

2. 静态全局变量 (Static Global Variables)

  • 定义: 在全局范围内用 static 修饰的变量。

  • 特点:

    • 它的生命周期也是整个程序运行期间。

    • 但它的作用域被限制在定义它的文件内(文件作用域),无法被其他文件通过 extern 访问。

  • 示例:

    // file1.cpp
    static int globalVar = 10; // 只在 file1.cpp 中可见
    
    void printVar() {
        std::cout << globalVar << std::endl;
    }
    
    // file2.cpp
    // extern int globalVar; // 错误!无法访问 file1.cpp 中的 static globalVar

    用途: 用于防止全局变量被其他文件意外访问,增强模块封装性。

3. 静态函数 (Static Functions)

  • 定义: 用 static 修饰的函数。

  • 特点:

    • 类似于静态全局变量,作用域被限制在定义它的文件内。

    • 不能被其他文件通过声明调用。

  • 示例:

    // file1.cpp
    static void myFunction() {
        std::cout << "This is a static function." << std::endl;
    }
    
    // file2.cpp
    // myFunction(); // 错误!无法访问 file1.cpp 中的 static 函数

    用途: 通常用于封装只在本文件内使用的工具函数。

4. 类的静态成员 (Static Class Members)

在类中使用 static 有两种情况:静态成员变量和静态成员函数。

(1) 静态成员变量

  • 定义: 用 static 修饰的类成员变量。

  • 特点:

    • 它属于类本身,而不是类的某个对象。

    • 所有对象共享同一个静态成员变量。

    • 必须在类外进行定义和初始化(通常在 .cpp 文件中)。

  • 示例:

    #include <iostream>
    class MyClass {
    public:
        static int sharedValue; // 声明静态成员变量
    };
    
    int MyClass::sharedValue = 100; // 定义并初始化
    
    int main() {
        MyClass obj1, obj2;
        obj1.sharedValue = 200; // 修改静态成员
        std::cout << obj2.sharedValue << std::endl; // 输出: 200
        std::cout << MyClass::sharedValue << std::endl; // 输出: 200
        return 0;
    }

    解释: sharedValue 是类的属性,通过类名或对象都可以访问和修改。

(2) 静态成员函数

  • 定义: 用 static 修饰的类成员函数。

  • 特点:

    • 它属于类本身,不依赖于某个对象。

    • 只能访问类的静态成员变量,无法访问非静态成员(因为没有 this 指针)。

  • 示例:

    #include <iostream>
    class MyClass {
    public:
        static int sharedValue;
        static void printValue() {
            std::cout << "Shared Value: " << sharedValue << std::endl;
        }
    };
    
    int MyClass::sharedValue = 100;
    
    int main() {
        MyClass::printValue(); // 输出: Shared Value: 100
        return 0;
    }

    用途: 常用于工具函数或管理类的静态数据。

5. static 的内存分配

  • 静态变量(无论全局、局部还是类的静态成员)通常存储在程序的静态存储区(Data Segment),而不是栈或堆上。

  • 这意味着它们的内存分配在程序启动时完成,程序结束时销毁。

6. 总结对比

类型

生命周期

作用域

初始化时机

静态局部变量

程序运行期间

函数内部

第一次调用时

静态全局变量

程序运行期间

文件内部

程序启动时

静态函数

程序运行期间

文件内部

无需初始化

静态成员变量

程序运行期间

类范围

类外定义时

静态成员函数

程序运行期间

类范围

无需初始化

7. 常见问题

  • 为什么用 static?

    • 控制作用域(限制访问)。

    • 延长生命周期(避免重复初始化)。

    • 实现类级别的共享数据或行为。

  • 和非静态的区别?

    • 非静态变量/函数依赖对象实例,每次创建对象时分配内存;静态的则与类或文件绑定,内存分配更持久且共享。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐