成员函数指针的定义和使用方法
- 定义:成员函数指针是一种指向类成员函数的指针。其定义语法为
return_type (class_name::*pointer_name)(parameters)
。例如,假设有一个类 MyClass
,其中有一个成员函数 void func(int arg)
,则指向该函数的指针定义为 void (MyClass::*funcPtr)(int)
。
- 使用方法:首先需要将指针指向类的特定成员函数,然后通过对象(或对象指针)来调用该函数。调用时使用
.*
运算符(针对对象)或 ->*
运算符(针对对象指针)。
成员函数指针与函数对象(functor)在实现和应用场景上的区别
- 实现:
- 成员函数指针:是一种指针类型,直接指向类的成员函数,它只包含函数的地址信息。
- 函数对象:是一个类,它重载了
()
运算符,使得该类的对象表现得像一个函数。函数对象可以包含状态信息(成员变量),而成员函数指针不可以。
- 应用场景:
- 成员函数指针:适用于需要直接调用类成员函数,且不需要额外状态信息的场景。例如,在简单的回调机制中,当需要将类的成员函数作为回调函数传递时可以使用。
- 函数对象:适用于需要在调用函数时携带额外状态信息的场景。例如,在标准库算法(如
std::for_each
)中,函数对象可以携带统计信息等成员变量,方便在算法执行过程中使用。
代码示例
- 使用成员函数指针调用类的成员函数:
#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;
}
- 函数对象的使用:
#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;
}