MST
星途 面试题库

面试题:C++ 函数指针与类成员函数指针的差异及应用

阐述 C++ 中普通函数指针和类成员函数指针的区别。假设有一个类 `MyClass`,其中包含一个成员函数 `void memberFunction(int param)`,请展示如何定义和使用指向这个成员函数的指针,并且在类外部通过对象调用该成员函数指针。同时说明在使用类成员函数指针时需要注意的事项。
23.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

普通函数指针和类成员函数指针的区别

  1. 调用方式
    • 普通函数指针:直接通过指针调用函数,语法为(*funcPtr)(args),这里funcPtr是普通函数指针,args是函数参数。普通函数在内存中有独立的地址,不依赖于任何对象。
    • 类成员函数指针:需要通过类对象或指向类对象的指针来调用,语法为(obj.*memFuncPtr)(args)(ptr->*memFuncPtr)(args),其中obj是类对象,ptr是指向类对象的指针,memFuncPtr是类成员函数指针。类成员函数与类的特定对象相关联,除了函数代码外,还需要对象的this指针来确定操作的具体对象。
  2. 指针类型
    • 普通函数指针:类型只包含函数的参数列表和返回类型,例如int (*funcPtr)(int, int)表示指向返回int类型,接受两个int类型参数的普通函数指针。
    • 类成员函数指针:类型除了函数的参数列表和返回类型外,还与类相关,例如void (MyClass::*memFuncPtr)(int)表示指向MyClass类中接受一个int参数且返回void的成员函数指针。

定义和使用指向MyClass::memberFunction的指针

假设有如下MyClass类:

class MyClass {
public:
    void memberFunction(int param) {
        std::cout << "Member function called with param: " << param << std::endl;
    }
};

定义和使用指向memberFunction的指针如下:

#include <iostream>

class MyClass {
public:
    void memberFunction(int param) {
        std::cout << "Member function called with param: " << param << std::endl;
    }
};

int main() {
    // 定义类成员函数指针
    void (MyClass::*memFuncPtr)(int) = &MyClass::memberFunction;
    MyClass obj;
    // 通过对象调用成员函数指针
    (obj.*memFuncPtr)(42); 

    MyClass* ptr = &obj;
    // 通过对象指针调用成员函数指针
    (ptr->*memFuncPtr)(100); 

    return 0;
}

使用类成员函数指针时需要注意的事项

  1. 初始化:类成员函数指针必须初始化后才能使用,要确保其指向类的实际成员函数。
  2. 对象关联性:调用类成员函数指针时,必须通过有效的类对象或指向类对象的指针,否则会导致未定义行为。
  3. 多态性:如果类成员函数是虚函数,使用类成员函数指针调用时不会体现多态性。要实现多态调用,需要使用virtual函数结合dynamic_cast等机制,而不是直接使用类成员函数指针。