C++-static关键字

文章目录

  • 前言
  • 一、全局变量或函数:限制作用域(内部链接)
  • 二、局部变量:延长生命周期
  • 三、类的静态成员变量
  • 四、类的静态成员函数
  • 五、函数内的静态对象
  • 注意事项
  • 总结


前言

C++ 中的 static 关键字用途广泛,具体用法因上下文而异。以下是其主要应用场景及用途:


一、全局变量或函数:限制作用域(内部链接)

  • 用途:将全局变量或函数的作用域限制在当前文件内,避免命名冲突。

  • 语法

// 文件内全局变量(仅当前文件可见)
static int globalVar = 42;

// 文件内函数(仅当前文件可见)
static void helper() { /* ... */ }
  • 效果
    • 全局变量/函数默认具有外部链接(可在其他文件中通过 extern 访问),static 将其改为内部链接。
    • C++11 后更推荐使用匿名命名空间替代:
namespace { // 匿名命名空间
    int globalVar = 42;
    void helper() { /* ... */ }
}

二、局部变量:延长生命周期

  • 用途:使局部变量的生命周期持续到程序结束,但作用域仍限于函数内。

  • 语法

void func() {
    static int count = 0; // 初始化仅一次
    count++;
    std::cout << "调用次数: " << count << std::endl;
}
  • 效果
    • 变量在首次调用时初始化,后续调用保留之前的值。
    • 常用于计数器、单例模式或延迟初始化。

三、类的静态成员变量

  • 用途:声明属于类本身的变量,所有实例共享同一份数据。

  • 语法

class MyClass {
public:
    static int sharedVar; // 声明(类内)
};

// 类外定义并初始化(必须)
int MyClass::sharedVar = 0;
  • 规则
    • 必须在类外定义(分配存储空间)。
    • constconstexpr 静态成员可在类内直接初始化:
class MyClass {
public:
    static const int x = 10;         // 允许(整型常量)
    static constexpr double y = 3.14;// C++11 起允许
};
// 若需取地址,仍需在类外定义(如 `const int MyClass::x;`)

四、类的静态成员函数

  • 用途:定义不依赖实例的函数,仅能访问静态成员。
  • 语法
class MyClass {
public:
    static void printInfo() {
        std::cout << "静态函数,共享变量值: " << sharedVar << std::endl;
    }
    static int sharedVar;
};
  • 规则
    • this 指针,不能访问非静态成员。
    • 可通过类名直接调用:MyClass::printInfo()

五、函数内的静态对象

  • 用途:延迟初始化或实现单例模式。

  • 语法:

Singleton& getInstance() {
    static Singleton instance; // 首次调用时构造,程序结束时析构
    return instance;
}
  • 效果
    • 对象仅在首次调用时初始化,线程安全(C++11 起)。

注意事项

  1. 静态变量初始化顺序:不同编译单元的静态变量初始化顺序不确定,需避免依赖关系。

  2. 模板类中的静态成员:每个模板实例有独立的静态成员。

  3. 继承与静态函数:静态函数可被继承,但子类同名静态函数会隐藏父类函数。

  4. 虚函数:静态函数不能为虚函数(无 this 指针)。


总结

上下文 用途 关键特性
全局变量/函数 限制作用域到文件 内部链接,避免冲突
局部变量 延长生命周期至程序结束 保持局部作用域,持久化值
类静态成员变量 类级别共享数据 所有实例共享,类外定义
类静态成员函数 无需实例的操作 无 this,仅访问静态成员
函数内静态对象 单例、延迟初始化 线程安全(C++11起),仅一次构造

通过合理使用 static 关键字,可以优化代码结构、管理数据生命周期并控制访问范围。

你可能感兴趣的:(c++)