首页 > 编程笔记

C++ static静态成员函数(入门必读)

在 C++ 中,在普通成员函数的基础上,用 static 关键字修饰它,这样的成员函数被称为静态成员函数。

例如:
class MyClass {
public:
    static void staticFunction(); //静态成员函数
};
和普通的成员函数一样,静态成员函数可以直接在类内部实现,也可以在类外部实现,当在类外面实现的时候,不需要 static 关键字。

和普通的成员函数不同的是,静态成员函数里没有 this 指针,所以函数内部只能使用类中的静态成员(静态成员变量和静态成员函数),无法使用非静态成员。

举个简单的例子:
class Student {
public:
    Student(string n) : name(n) {
        ++totalStudents;
    }

    ~Student() {
        --totalStudents;
    }

    static int getTotalStudents() { //静态成员函数
        return totalStudents;
    }

private:
    string name;
    static int totalStudents; //静态成员变量
};

// 初始化静态成员变量
int Student::totalStudents = 0;
在 Student 类中,getTotalStudents() 是一个静态成员函数,它的内部只能使用 totalStudents 静态成员变量,而不允许使用非静态成员(比如 name)。

静态成员函数的使用

静态成员函数不依赖于类的实例,而是直接与类名绑定。因此,静态成员函数可以通过类名直接调用,虽然当前类的对象也可以调用,但不推荐这样做。

仍以 Student 类为例,下面程序演示了调用 getTotalStudents() 函数的方法。
#include <iostream>
using namespace std;

class Student {
public:
    Student(string n) : name(n) {
        ++totalStudents;
    }

    ~Student() {
        --totalStudents;
    }

    static int getTotalStudents() { //静态成员函数
        return totalStudents;
    }

private:
    string name;
    static int totalStudents; //静态成员变量
};

// 初始化静态成员变量
int Student::totalStudents = 0;

int main() {
    cout << "Total Students: " << Student::getTotalStudents() << endl; // 输出 0

    Student s1("Alice");
    Student s2("Bob");
   
    cout << "Total Students: " << Student::getTotalStudents() << endl; // 输出 2

    {
        Student s3("Charlie");
        cout << "Total Students: " << Student::getTotalStudents() << endl; // 输出 3
    } // s3 被销毁

    cout << "Total Students: " << Student::getTotalStudents() << endl; // 输出 2
   
    return 0;
}
运行结果为:

Total Students: 0
Total Students: 2
Total Students: 3
Total Students: 2

总结

普通成员函数内部有 this 指针,可以使用类中的所有成员(包括成员变量和成员函数);静态成员函数内部没有 this 指针,只能使用静态成员。

静态成员函数不依赖于类的实例,而是直接与类名绑定。因此,静态成员函数通过类名直接调用,而不是通过对象。

静态成员函数提供了一种与类而非对象相关联的方法,这使得它在设计模式(如单例和工厂模式)、对静态成员变量的操作(访问和修改)中非常有用。

推荐阅读