C++静态

C++ 中的「静态(static)」

static 是 C++ 中作用最多、最容易混淆的关键字,核心分三大场景局部静态类/结构体静态全局静态(补充)


一、局部静态(函数内的 static)

定义

函数内部static 声明的局部变量,叫局部静态变量

核心特性

  1. 生命周期:程序启动时分配内存程序结束才释放(不是函数调用结束就销毁)
  2. 初始化只初始化一次,后续调用函数会保留上一次的值
  3. 作用域:依然只在函数内部可见,外部无法访问

代码示例

#include <iostream>
using namespace std;

void test() {
    // 局部静态变量:只初始化 1 次
    static int count = 0; 
    count++;
    cout << "count = " << count << endl;
}

int main() {
    test(); // 输出 1
    test(); // 输出 2
    test(); // 输出 3
    return 0;
}

结果:count 会持续累加,不会被重置。


二、类 / 结构体中的静态(static 成员)

类/结构体里的 static 分为:静态成员变量静态成员函数

1. 静态成员变量

核心特性

  1. 属于类,不属于对象:所有对象共享同一个变量,不占用对象内存
  2. 必须类内声明,类外初始化!!!
  3. 生命周期:程序全局,和程序同生共死
  4. 访问方式类名::变量名对象.变量名

代码示例

#include <iostream>
using namespace std;

class Person {
public:
    // 类内声明静态成员变量
    static int total; 
    
    Person() {
        total++; // 构造时计数
    }
};

// 类外初始化(必须写!)
int Person::total = 0; 

int main() {
    Person p1;
    Person p2;
    // 直接用类名访问
    cout << "总人数:" << Person::total << endl; // 输出 2
    return 0;
}

2. 静态成员函数

核心特性

  1. 属于类,不属于对象
  2. 只能访问静态成员(静态变量/静态函数),不能访问普通成员变量/函数
  3. 没有 this 指针
  4. 访问方式:类名::函数名()

代码示例

class Person {
public:
    static int total;
    // 静态成员函数
    static void showTotal() {
        // 只能访问静态变量
        cout << "总人数:" << total << endl; 
    }
};

int Person::total = 0;

// 调用:
Person::showTotal(); // 无需创建对象,直接用类调用

三、补充:全局静态(文件内的 static)

虽然你没问,但这是 static 三大用法之一,必须补齐:

  • 函数外、全局区声明的 static 变量/函数
  • 作用域限制在当前文件内,其他文件无法访问(避免命名冲突)
// 全局静态变量:仅当前 .cpp 文件可用
static int num = 100; 

static void func() {
    // 仅当前文件可调用
}

一张表总结 C++ 静态关键字

类型 位置 生命周期 作用域 核心特点
局部静态 函数内部 程序全程 函数内 只初始化一次,值会保留
静态成员变量 类/结构体中 程序全程 类内+友元 所有对象共享,类外初始化
静态成员函数 类/结构体中 程序全程 类内+友元 无this,只能访问静态成员
全局静态 文件全局区 程序全程 当前文件 外部文件不可见,防冲突

总结

  1. 局部 static:函数内变量不销毁、保留值
  2. 类 static:成员属于类、所有对象共享,静态函数只能访问静态成员
  3. 全局 static:限制作用域在当前文件,避免命名冲突

此文章使用豆包辅助编写完成

posted @ 2026-04-02 09:30  道长不姓王  阅读(36)  评论(0)    收藏  举报