08. Static

1.全局/命名空间下的static

2.函数内的static(静态局部变量)

3.类/结构体静态成员


1.全局/命名空间下的static

csharp 复制代码
static修饰全局变量/函数时, 会将其作用域限制在当前编译单元(.cpp文件), 避免多文件同名符号的链接冲突

// 全局静态变量:仅当前.cpp文件可见
static int global_static = 20;

// 全局静态函数:仅当前.cpp文件可见
static void static_global_func() {
    cout << "全局静态函数:" << global_static << endl;
}

2.函数内的static(静态局部变量)

csharp 复制代码
static修饰函数内的局部变量时, 变量的生命周期变为全局(程序运行期一直存在), 但作用域仍为函数内, 且初始化仅执行

一次

void count_func() {
    // 局部静态变量:第一次调用时初始化,后续调用保留值
    static int counter = 0;
    counter++;
    cout << "调用次数:" << counter << endl;
}

3.类/结构体静态成员

csharp 复制代码
1).静态成员的核心概念

静态成员(包括静态成员变量和静态成员函数)是属于整个类/结构体, 而非某个具体对象的成员; 无论创建多少个类的对象, 

静态成员只有一份拷贝, 被所有对象共享, 这是它和普通成员最核心的区别

csharp 复制代码
2).静态成员变量

a.声明: 在类/结构体内部, 成员变量前加static关键字

b.初始化: 必须在类外初始化(唯一例外: const static的整型/枚举类型可在类内直接初始化), 初始化时无需重复写static

c.存储: 不占用对象的内存空间, 存放在程序的静态存储区(全局区)

d.访问: 可通过「类名」「对象」「指针」访问, 推荐用类名访问
csharp 复制代码
#include <iostream>
#include <string>
using namespace std;

// 学生类:统计总人数(适合用静态变量)
class Student {
public:
    // 普通成员(每个对象独有)
    string name;
    int age;
    // 静态成员变量(所有对象共享)
    static int totalCount; // 类内声明

    // 构造函数:创建对象时总数+1
    Student(string n, int a) : name(n), age(a) {
        totalCount++;
    }
};

// 静态成员变量:类外初始化(必须!)
int Student::totalCount = 0;

int main() {
    Student s1("张三", 18);
    Student s2("李四", 19);
    Student s3("王五", 20);

    // 三种访问方式
    cout << "通过对象访问:" << s1.totalCount << endl;    // 3
    cout << "通过类名访问:" << Student::totalCount << endl; // 3(推荐)
    cout << "通过指针访问:" << (&s2)->totalCount << endl; // 3

    return 0;
}
csharp 复制代码
#include <iostream>
using namespace std;

// 点结构体:统计创建的点数量
struct Point {
    int x, y; // 普通成员
    static int pointCount; // 静态成员(默认public)

    Point(int a, int b) : x(a), y(b) {
        pointCount++;
    }
};

// 类外初始化
int Point::pointCount = 0;

int main() {
    Point p1(1,2);
    Point p2(3,4);
    cout << "点的总数:" << Point::pointCount << endl; // 输出2
    return 0;
}

csharp 复制代码
3).静态成员函数

a.声明: 成员函数前加static关键字

b.无this指针: 静态函数属于类, 而非对象, 因此没有指向具体对象的this指针

c.访问限制: 只能直接访问静态成员(变量/函数), 不能直接访问非静态成员(除非通过对象/指针显式访问)

d.调用方式: 可通过类名直接调用(推荐), 也可通过对象 / 指针调用
csharp 复制代码
#include <iostream>
using namespace std;

class Counter {
private:
    static int count; // 私有静态变量
public:
    // 静态成员函数:修改静态变量
    static void increment() {
        count++; // 合法:访问静态成员
    }

    // 静态成员函数:获取计数
    static int getCount() {
        return count;
    }

    // 普通成员函数:可访问静态成员
    void reset() {
        count = 0;
    }
};

// 初始化私有静态变量
int Counter::count = 0;

int main() {
    // 无需创建对象,直接通过类名调用静态函数
    Counter::increment();
    Counter::increment();
    cout << "当前计数:" << Counter::getCount() << endl; // 2

    // 也可通过对象调用
    Counter c;
    c.increment();
    cout << "当前计数:" << c.getCount() << endl; // 3

    // 普通函数重置计数
    c.reset();
    cout << "重置后计数:" << Counter::getCount() << endl; // 0

    return 0;
}
相关推荐
千谦阙听2 小时前
C++类和对象(中):默认成员函数、构造与析构、拷贝构造、运算符重载
开发语言·c++·学习
weixin_307779132 小时前
一维无粘 Burgers 方程的激波形成问题:MacCormack 格式求解
c++·算法·matlab
HugoStudio_SWAN3 小时前
洛谷 B4500 / B4449 / B3843 凯撒密码、密码强度与密码合规——加密与安全的三道门
c++·学习·程序人生·算法·安全
雾里看山3 小时前
源码目录、构建目录与 out-of-source build
c++·软件构建·cmake
渡我白衣5 小时前
并查集:基础认识与模拟实现
android·java·javascript·数据结构·c++·算法·并查集
如意猴5 小时前
【C++】001--C++入门(1)
开发语言·c++
hetao17338375 小时前
2026-09-01~09-04 hetao1733837 的刷题记录
c++·算法
HugoStudio_SWAN8 小时前
洛谷 P1420 / P1179 / B4262 最长连号、数字统计与词频统计——统计的三种面孔
c++·学习·程序人生·算法
raindayinrain9 小时前
c++并发
c++
j7~9 小时前
【C++】智能指针的使用及其原理--详解
c++·c++11·内存泄漏·智能指针·raii·boost智能指针