首页 > 编程笔记
C++ static静态成员函数(入门必读)
在 C++ 中,在普通成员函数的基础上,用 static 关键字修饰它,这样的成员函数被称为静态成员函数。
例如:
和普通的成员函数不同的是,静态成员函数里没有 this 指针,所以函数内部只能使用类中的静态成员(静态成员变量和静态成员函数),无法使用非静态成员。
举个简单的例子:
仍以 Student 类为例,下面程序演示了调用 getTotalStudents() 函数的方法。
静态成员函数不依赖于类的实例,而是直接与类名绑定。因此,静态成员函数通过类名直接调用,而不是通过对象。
静态成员函数提供了一种与类而非对象相关联的方法,这使得它在设计模式(如单例和工厂模式)、对静态成员变量的操作(访问和修改)中非常有用。
例如:
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 指针,只能使用静态成员。静态成员函数不依赖于类的实例,而是直接与类名绑定。因此,静态成员函数通过类名直接调用,而不是通过对象。
静态成员函数提供了一种与类而非对象相关联的方法,这使得它在设计模式(如单例和工厂模式)、对静态成员变量的操作(访问和修改)中非常有用。