静态成员属于类本身,所有对象共享同一份;需在类内声明(带static)、类外定义初始化;静态成员函数无this指针,只能访问静态成员,可通过类名或对象调用。
静态成员属于类本身,不属于任何具体对象,所有对象共享同一份静态成员。它在类外定义、在类内声明,能被所有实例访问,也能通过类名直接调用。
静态数据成员必须在类内声明(带 static 关键字),并在类外单独定义并初始化(不加 static)。未初始化的静态整型成员默认为 0,但显式初始化更安全、清晰。
例如:
class Counter {
public
:
static int count; // 声明:仅此一行,不分配内存
Counter() { ++count; }
~Counter() { --count; }
};
int Counter::count = 0; // 定义并初始化:必须有,且只能有一处
立即学习“C++免费学习笔记(深入)”;
// 使用
Counter a, b, c;
std::cout << Counter::count << std::endl; // 输出 3
静态成员函数没有 this 指针,只能访问静态数据成员和其他静态成员函数,不能直接访问非静态成员。它可通过类名或对象调用,推荐用类名调用以强调其“类级别”属性。
例如:
class Logger {
public:
static int logLevel;
static void setLevel(int level) {
logLevel = level; // ✅ 可访问静态成员
}
static void log(const char* msg) {
if (logLevel > 0) std::cout << "[LOG] " << msg << std::endl;
}
// void printCount() { std::cout << count << std::endl; } // ❌ 错误:count 未声明为 static
};
int Logger::logLevel = 1;
// 调用方式(都合法)
Logger::setLevel(2);
Logger::log("System started");
Logger inst;
inst.log("Instance used"); // 也可通过对象调用,但语义上不推荐
静态成员遵守和普通成员一样的访问控制(public/private/protected)。私有静态成员只能由类内函数访问,常用于实现单例、计数器或内部缓存等场景。
例如(C++17):
class Config {
private:
inline static int timeout = 5000; // 类内定义+初始化,无需类外再写
public:
static int getTimeout() { return timeout; }
static void setTimeout(int t) { timeout = t; }
};