静态成员

内容简介

静态成员属于类本身,不属于某一个对象。所有对象共享同一份静态成员变量,静态成员函数不能访问非静态成员。

静态成员变量

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
  • 静态成员变量的初始化和全局对象初始化顺序问题有关,复杂对象要谨慎。

学习路径