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 关键字,可以优化代码结构、管理数据生命周期并控制访问范围。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值