21xrx.com
2025-03-14 17:47:55 Friday
文章检索 我的文章 写文章
C++ 中的成员函数指针和函数对象
2023-07-06 22:04:52 深夜i     14     0
C++ 成员函数指针 函数对象

在C++中,成员函数指针和函数对象都是用来描述函数的方法。它们可以让程序员在运行时动态地调用函数,从而实现更灵活的编程。

成员函数指针是一个指向成员函数的指针。成员函数的地址需要加上一个“&”符号来获取。使用成员函数指针,我们可以在运行时动态地调用不同的成员函数。这对于需要根据条件来执行不同功能的程序来说非常有用。

而函数对象则是一种可调用的对象。一个函数对象就是一个类,它重载了运算符()。使用函数对象,我们可以将一个函数封装到一个对象中,方便地传递给其他函数。这在函数作为参数的情况下非常有用。

两者的用途略有不同,但本质上都是用来描述函数。成员函数指针主要用于操作类的成员函数,而函数对象则可以用于普通函数和类的成员函数。

例如,我们可以将不同的成员函数指针封装到一个数组中:

class MyClass {
public:
  void function1() cout << "Function 1" << endl;
  void function2() cout << "Function 2" << endl;
};
typedef void (MyClass::*MemberFunction)();
MemberFunction functions[2] = &MyClass::function2 ;
int main() {
  MyClass obj;
  int choice;
  cout << "Enter 1 or 2: ";
  cin >> choice;
  // 使用成员函数指针调用不同的成员函数
  (obj.*functions[choice-1])();
  
  return 0;
}

在上面的例子中,我们将MyClass类的两个成员函数指针存储在数组中。然后,我们根据用户的输入选择要调用的成员函数。最后,我们使用成员函数指针动态地调用不同的成员函数。

而函数对象可以用于将函数作为参数传递给其他函数。例如,我们可以使用函数对象对容器中的元素进行排序:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
class MyCompare {
public:
  bool operator()(int a, int b) {
    return a < b;
  }
};
int main() {
  vector<int> v { 3, 7, 1, 10, 2 };
  
  // 使用函数对象对容器中的元素进行排序
  sort(v.begin(), v.end(), MyCompare());
  for (auto i : v) {
    cout << i << " ";
  }
  cout << endl;
  return 0;
}

在上面的例子中,我们定义了一个名为MyCompare的函数对象。MyCompare类中重载了()运算符,以此来实现元素的比较。在主函数中,我们使用了函数对象来对容器中的元素进行排序。

总之,成员函数指针和函数对象在C++中都是非常有用的工具。它们可以让程序员更加灵活地描述函数,并在程序中动态地调用不同的函数。如果你还没有使用过这两种方法,建议你学习一下它们的使用方法。

  
  
下一篇: C++ 进制转换

评论区