# 静态成员

URL: https://caijiao.org/cpp/oop/static
Source: docs/cpp/oop/static.md
Description: 本节介绍 C++ 中的静态成员，包括静态数据成员和静态成员函数。静态成员属于类本身，而不是某个具体的对象，因此它们在所有对象间共享。理解静态成员的作用和使用方式对于优化程序的性能和内存管理至关重要。

在 C++ 中，**静态成员** 是属于类本身而不是类的实例的成员。静态成员可以是静态数据成员（变量）或静态成员函数。它们的特点是所有对象共享同一份静态成员，而不是每个对象都有一份副本。

## 静态数据成员

静态数据成员属于类，而不是类的实例，因此它们是类级别的。所有对象共享同一份静态数据成员，这使得静态成员在跨多个对象之间传递信息变得非常有用。静态数据成员不依赖于任何特定的对象，而是与类本身关联。

### 静态数据成员的声明和定义

静态数据成员需要在类内声明，在类外定义。

### 示例：静态数据成员

```cpp
#include <iostream>
using namespace std;

class Counter {
private:
    static int count;  // 静态数据成员

public:
    Counter() {
        count++;
    }

    static int getCount() {  // 静态成员函数
        return count;
    }
};

// 定义静态数据成员
int Counter::count = 0;

int main() {
    Counter c1;
    Counter c2;
    cout << "Current count: " << Counter::getCount() << endl;  // 输出：Current count: 2
    return 0;
}
````

### 输出：

```
Current count: 2
```

在上面的例子中，`count` 是静态数据成员，它在所有 `Counter` 对象间共享。每次创建一个新的 `Counter` 对象，`count` 的值都会增加。静态数据成员通过类名直接访问，例如 `Counter::getCount()`。

## 静态成员函数

静态成员函数是与类本身而非具体对象关联的成员函数。静态成员函数只能访问静态数据成员，因为它没有 `this` 指针，因此无法访问非静态成员。静态成员函数通常用于操作静态数据成员或作为类的公共接口。

### 静态成员函数的声明和定义

静态成员函数需要在类内部声明，并且与普通成员函数的定义一样，它们通常在类外进行定义。

### 示例：静态成员函数

```cpp
#include <iostream>
using namespace std;

class Math {
public:
    static int add(int a, int b) {  // 静态成员函数
        return a + b;
    }
};

int main() {
    int result = Math::add(5, 3);  // 通过类名调用静态成员函数
    cout << "Sum: " << result << endl;  // 输出：Sum: 8
    return 0;
}
```

### 输出：

```
Sum: 8
```

在上面的例子中，`add` 是一个静态成员函数，它可以通过类名直接调用，而不需要实例化类对象。静态成员函数通常用于那些不依赖于类的对象状态的操作，例如数学计算、全局计数等。

## 静态成员的特点

* **共享数据**：静态数据成员在所有类的实例之间共享，所有对象访问同一份数据。这使得静态成员非常适合用于存储类的全局信息。
* **类级别的函数**：静态成员函数不依赖于任何具体对象，因此它们无法访问对象的实例数据成员和非静态成员函数。
* **在类外定义**：静态数据成员需要在类外进行定义，并且只能通过类名进行访问（例如 `ClassName::staticMember`）。

## 静态成员的用途

* **计数器**：可以使用静态数据成员来统计类的实例化数量，类似于我们上面示例中的 `count`。
* **全局共享数据**：静态成员可以用于存储跨多个对象共享的数据，如日志记录、配置项等。
* **辅助功能**：静态成员函数常常作为帮助函数或工具函数，用于执行不依赖于对象状态的操作。

## 总结

* **静态数据成员**：属于类，而非类的实例，所有对象共享同一份静态数据成员。
* **静态成员函数**：不依赖于对象状态，通常用于操作静态数据成员或提供类的全局接口。
* 静态成员的使用有助于优化程序的性能和内存管理，特别是在需要跨多个对象共享数据时。

理解静态成员的概念及其正确使用方法，有助于写出更加高效、可维护的 C++ 代码。
