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;
}