📜  有关C++中静态成员函数的一些有趣事实(1)

📅  最后修改于: 2023-12-03 14:55:23.819000             🧑  作者: Mango

有关C++中静态成员函数的一些有趣事实

什么是静态成员函数

在C++中,我们可以将函数定义为类的成员函数,这样这个函数就可以在类的对象上调用。而静态成员函数则是一种特殊的成员函数,它被类所有的对象共享,不需要创建对象就可以使用它。

在类定义中,我们可以通过在函数声明前加上关键字static来将它定义为静态成员函数。

class MyClass {
public:
    static void myStaticFunc();
};
静态成员函数没有this指针

在C++中,每个非静态成员函数都有一个额外的参数,称为this指针,它指向当前对象的地址。但是,静态成员函数没有这个指针,因为它不是针对特定对象的调用,而是针对整个类的调用。因此,在静态成员函数中无法访问普通成员变量和成员函数。

静态成员函数可以访问静态成员变量

尽管无法访问普通成员变量和成员函数,静态成员函数仍然可以访问静态成员变量。静态成员变量是类级别的变量,它们属于整个类而不是类的对象。因此,静态成员函数可以访问这些变量而不需要实际的对象。

class MyClass {
public:
    static int myStaticVar;
    static void myStaticFunc() {
        myStaticVar = 42;
    }
};
int MyClass::myStaticVar = 0; // 初始化静态成员变量

int main() {
    MyClass::myStaticFunc(); // 调用静态成员函数
    std::cout << MyClass::myStaticVar << std::endl; // 输出 42
    return 0;
}
静态成员函数不能被声明为虚函数

虚函数在运行时通过对象的地址来确定调用哪个函数,而静态成员函数没有this指针,无法通过对象的地址来调用,因此不能将它们声明为虚函数。

静态成员函数可以作为回调函数

由于静态成员函数不依赖于特定的对象,它们可以作为回调函数使用。例如,我们可以在标准库的qsort()函数中使用静态成员函数作为比较函数。在比较函数中不需要访问任何对象或普通成员变量,只需要对传入的参数进行比较即可。

class MyClass {
public:
    static int compare(const void* a, const void* b) {
        int arg1 = *static_cast<const int*>(a);
        int arg2 = *static_cast<const int*>(b);
        if (arg1 < arg2) return -1;
        if (arg1 > arg2) return 1;
        return 0;
    }
};

int arr[] = { 3, 2, 1, 5, 4 };
int len = sizeof(arr) / sizeof(arr[0]);

int main() {
    qsort(arr, len, sizeof(int), MyClass::compare);
    for (int i = 0; i < len; i++) {
        std::cout << arr[i] << " "; // 输出 1 2 3 4 5
    }
    return 0;
}
总结

静态成员函数是C++中的一个有趣的概念,它们不依赖于特定的对象,可以在类级别上调用。它们不能访问普通成员变量和成员函数,但可以访问静态成员变量。由于缺乏this指针,静态成员函数不能被声明为虚函数。它们可以作为回调函数使用,执行简单的计算任务而不需要与特定对象交互。