MST

星途 面试题库

面试题:C++ 成员函数指针与函数对象的应用

阐述C++中成员函数指针的定义和使用方法,以及它与函数对象(functor)在实现和应用场景上的区别。并通过代码示例展示如何使用成员函数指针调用类的成员函数以及函数对象的使用。
24.2万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

成员函数指针的定义和使用方法

  1. 定义:成员函数指针是一种指向类成员函数的指针。其定义语法为 return_type (class_name::*pointer_name)(parameters)。例如,假设有一个类 MyClass,其中有一个成员函数 void func(int arg),则指向该函数的指针定义为 void (MyClass::*funcPtr)(int)
  2. 使用方法:首先需要将指针指向类的特定成员函数,然后通过对象(或对象指针)来调用该函数。调用时使用 .* 运算符(针对对象)或 ->* 运算符(针对对象指针)。

成员函数指针与函数对象(functor)在实现和应用场景上的区别

  1. 实现
    • 成员函数指针:是一种指针类型,直接指向类的成员函数,它只包含函数的地址信息。
    • 函数对象:是一个类,它重载了 () 运算符,使得该类的对象表现得像一个函数。函数对象可以包含状态信息(成员变量),而成员函数指针不可以。
  2. 应用场景
    • 成员函数指针:适用于需要直接调用类成员函数,且不需要额外状态信息的场景。例如,在简单的回调机制中,当需要将类的成员函数作为回调函数传递时可以使用。
    • 函数对象:适用于需要在调用函数时携带额外状态信息的场景。例如,在标准库算法(如 std::for_each)中,函数对象可以携带统计信息等成员变量,方便在算法执行过程中使用。

代码示例

  1. 使用成员函数指针调用类的成员函数
#include <iostream>

class MyClass {
public:
    void printMessage(int num) {
        std::cout << "Message " << num << std::endl;
    }
};

int main() {
    MyClass obj;
    void (MyClass::*funcPtr)(int) = &MyClass::printMessage;
    (obj.*funcPtr)(42);

    MyClass* objPtr = &obj;
    (objPtr->*funcPtr)(100);

    return 0;
}
  1. 函数对象的使用
#include <iostream>
#include <algorithm>
#include <vector>

class Adder {
private:
    int value;
public:
    Adder(int val) : value(val) {}
    int operator()(int num) {
        return num + value;
    }
};

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};
    Adder add5(5);
    std::transform(numbers.begin(), numbers.end(), numbers.begin(), add5);

    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}