静态成员
内容简介
静态成员属于类本身,不属于某一个对象。所有对象共享同一份静态成员变量,静态成员函数不能访问非静态成员。
静态成员变量
class Person {
public:
static int count;
};
int Person::count = 0;访问方式:
Person p1;
Person p2;
p1.count = 10;
std::cout << p2.count << '\n'; // 10
std::cout << Person::count << '\n'; // 推荐特点:
- 所有对象共享一份数据。
- 类内声明,类外定义。
- 不占普通对象的成员存储空间。
静态成员函数
class Person {
public:
static void set_count(int value)
{
count = value;
}
static int count;
};
int Person::count = 0;
Person::set_count(100);静态成员函数没有 this 指针,因此不能直接访问非静态成员。
class Person {
public:
static void func()
{
// age_ = 18; // 错误:没有 this,无法访问对象成员
}
private:
int age_ = 0;
};最佳代码实践
- 访问静态成员时优先使用
ClassName::member。 - 静态成员适合表达类级别状态或工具函数。
- 避免把静态成员变量滥用成全局可变状态。
- C++17 起可用
inline static在类内定义静态成员变量。
class Person {
public:
inline static int count = 0;
};错误用法
class Config {
public:
static std::string password;
};问题:全局可变配置会让依赖隐藏,测试和维护都变难。
注意事项
- 静态成员函数不能是虚函数。
- 静态成员函数没有
this。 - 静态成员变量的初始化和全局对象初始化顺序问题有关,复杂对象要谨慎。
学习路径
- 上一节:cpp类对象作为成员
- 当前阶段:cppOOP
- 下一节:cpp对象内存模型