LiSheng's blog LiSheng's blog
首页
笔记
个人简历
随笔集
GitHub (opens new window)
首页
笔记
个人简历
随笔集
GitHub (opens new window)
  • golang

  • cplus

    • 内存相关

    • 面向对象

    • STL相关

    • 内置数据结构
    • 数据结构示例
    • go和c++对比
    • 关键字

      • static
        • const、volatile、mutable
        • const_cast、dynamic_cast
        • struct、class、union
        • new、delete
        • operator
        • c++20 range
    • leetcode

    • 存储技术

    • 分布式系统

    • 计算机网络

    • Linux操作系统

    • Redis

    • 其他

    • 笔记
    • cplus
    • 关键字
    lisheng
    2024-09-10
    目录

    static

    在C++中,关键字static有多种用途,它可以用于修饰变量、函数以及类的成员。根据它的上下文,static的行为和意义有所不同。下面详细介绍static关键字在不同场景中的用法。

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

    在函数内部定义的静态局部变量,其生命周期贯穿整个程序运行过程,而不是在函数调用结束时销毁。静态局部变量只在第一次执行时初始化,以后每次调用函数时,该变量都会保留其上一次的值。

    void func() {
        static int counter = 0;  // 静态局部变量
        counter++;
        std::cout << "Counter: " << counter << std::endl;
    }
    
    int main() {
        func();  // 输出: Counter: 1
        func();  // 输出: Counter: 2
        func();  // 输出: Counter: 3
        return 0;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

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

    在文件作用域(通常是全局作用域)中声明的静态变量只能在该文件中访问,无法被其他文件中的代码访问。这样做可以避免命名冲突,是一种实现内部链接的方式。

    static int globalVar = 0;  // 静态全局变量
    
    void increment() {
        globalVar++;
    }
    
    int main() {
        increment();
        std::cout << globalVar << std::endl;  // 输出: 1
        return 0;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    # 3. 静态成员变量(Static Member Variable)

    静态成员变量是类的所有对象共享的变量,而不是每个对象都有自己的一份拷贝。静态成员变量在程序启动时分配内存,直到程序结束时才释放。它们在类的所有实例之间共享。

    • 声明:在类中声明静态成员变量。
    • 定义:在类外定义静态成员变量,并进行初始化。
    class MyClass {
    public:
        static int staticVar;  // 声明静态成员变量
    };
    
    int MyClass::staticVar = 0;  // 定义并初始化静态成员变量
    
    int main() {
        MyClass::staticVar = 10;
        MyClass obj1;
        MyClass obj2;
        std::cout << obj1.staticVar << std::endl;  // 输出: 10
        std::cout << obj2.staticVar << std::endl;  // 输出: 10
        return 0;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    # 4. 静态成员函数(Static Member Function)

    静态成员函数属于类而不是类的某个对象,它们不能访问非静态成员变量或非静态成员函数。静态成员函数可以通过类名直接调用,不需要通过类的对象调用。

    class MyClass {
    public:
        static int staticVar;
    
        static void staticFunc() {
            std::cout << "Static Function: " << staticVar << std::endl;
        }
    };
    
    int MyClass::staticVar = 0;
    
    int main() {
        MyClass::staticVar = 100;
        MyClass::staticFunc();  // 输出: Static Function: 100
        return 0;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

    # 5. 静态函数(Static Function)

    在文件作用域内定义的静态函数只能在定义它的文件中可见。其他文件中的代码无法访问该函数。这种用法用于实现模块化和封装。

    static void myFunc() {
        std::cout << "This is a static function." << std::endl;
    }
    
    int main() {
        myFunc();  // 输出: This is a static function.
        return 0;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8

    # 6. 静态类(Static Class)

    虽然C++不直接支持“静态类”,但可以通过将类的所有成员声明为静态的来模拟静态类的行为。这种类不需要实例化即可使用其成员。

    class StaticClass {
    public:
        static void staticFunc() {
            std::cout << "Static class function." << std::endl;
        }
    };
    
    int main() {
        StaticClass::staticFunc();  // 输出: Static class function.
        return 0;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    # 总结

    • 静态局部变量:在函数内部声明,生命周期贯穿整个程序运行过程,且值会在函数调用间保留。
    • 静态全局变量:在文件作用域内声明,具有文件内链接,无法被其他文件访问。
    • 静态成员变量:属于类而不是类的某个对象,所有对象共享同一个静态成员变量。
    • 静态成员函数:可以通过类名直接调用,不需要通过对象访问,且只能访问静态成员变量。
    • 静态函数:具有文件内链接,仅在声明它的文件内可见。

    static关键字在C++中有着广泛的用途,通过合理使用static可以实现更好的封装、优化内存管理,并控制变量和函数的可见性。

    编辑 (opens new window)
    上次更新: 2024/09/13, 11:59:12
    go和c++对比
    const、volatile、mutable

    ← go和c++对比 const、volatile、mutable→

    最近更新
    01
    ceph分布式存储-对象存储(RGW)搭建
    10-27
    02
    ceph分布式存储-集群客户端连接
    10-27
    03
    ceph分布式存储-管理crushmap
    10-27
    更多文章>
    Theme by Vdoing
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式