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;
}
相关推荐
一个不知名程序员www8 小时前
算法学习入门 --- 哈希表和unordered_map、unordered_set(C++)
c++·算法
C++ 老炮儿的技术栈8 小时前
在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?
c语言·c++·windows·git·vscode·visual studio
%xiao Q8 小时前
GESP C++五级-202406
android·开发语言·c++
Sarvartha8 小时前
C++ STL 栈的便捷使用
c++·算法
Aevget9 小时前
MFC扩展库BCGControlBar Pro v37.2 - 全新的VS 2026可视化管理器
c++·mfc·bcg·界面控件·ui开发
C+-C资深大佬9 小时前
C++类型判断
开发语言·c++
Yu_Lijing10 小时前
基于C++的《Head First设计模式》笔记——模式合作
c++·笔记·设计模式
zmzb010310 小时前
C++课后习题训练记录Day74
开发语言·c++
cdut_suye10 小时前
解锁函数的魔力:Python 中的多值传递、灵活参数与无名之美
java·数据库·c++·人工智能·python·机器学习·热榜