21xrx.com
2024-09-19 09:46:47 Thursday
登录
文章检索 我的文章 写文章
C++ 中的成员函数指针和函数对象
2023-07-06 22:04:52 深夜i     --     --
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++ 进制转换

评论区

{{item['qq_nickname']}}
()
回复
回复