函数对象条记

打印 上一主题 下一主题

主题 1667|帖子 1667|积分 5001

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
函数对象

C++中的函数对象就是C语言中的函数指针
函数指针

指向一个函数的指针,可以动态调用不同的函数。
  1. #include <iostream>
  2. // 一个普通的函数
  3. void hello() {
  4.     std::cout << "Hello, World!" << std::endl;
  5. }
  6. int add(int a, int b) {
  7.     return a + b;
  8. }
  9. int main() {
  10.     // 声明一个函数指针
  11.     void (*func_ptr)() = hello;  // func_ptr 指向 hello 函数
  12.     func_ptr();  // 调用 hello 函数
  13.     // 声明一个函数指针,指向返回 int 类型的函数
  14.     int (*add_ptr)(int, int) = add;
  15.     std::cout << "Sum: " << add_ptr(3, 4) << std::endl;  // 调用 add 函数
  16.     return 0;
  17. }
复制代码
函数指针的劣势



  • 代码中利用C++中的模板,调用利用函数指针调用函数。
  • 将函数指针传入compare时,编译器并不知道函数是什么。以是不能举行内联,导致会有函数的调用开销
  1. bool mygreater(int a, int b)
  2. {
  3.     return a > b;
  4. }
  5. bool myless(int a, int b)
  6. {
  7.     return a < b;
  8. }
  9. template<typename T, typename Com>
  10. bool compare(T a, T b, Com com)
  11. {
  12.     return com(a, b);
  13. }
  14. int main()
  15. {
  16.     cout << compare(1, 2, mygreater) << endl;;
  17.     cout << compare(1, 2, myless) << endl;;
  18. }
复制代码
函数对象(仿函数

重载了operator()的对象,可以如同函数一样被调用。
  1. #include <iostream>
  2. // 定义一个仿函数类
  3. class Adder {
  4. public:
  5.     int operator()(int a, int b) {
  6.         return a + b ;
  7.     }
  8. };
  9. int main() {
  10.     Adder add;  // 创建一个 Adder 对象,并初始化值为 10
  11.     std::cout << "Sum: " << add(3, 4) << std::endl;  // 调用 operator(),输出 17 (3 + 4 + 10)
  12.     return 0;
  13. }
复制代码
函数对象的优势



  • 传入函数的是一个对象,编译器知道函数是什么,因此可以举行内联,进步函数调用服从
  1. template<typename T>
  2. class mygreater {
  3. public:
  4.     bool operator()(T a, T b) { // 二元函数对象
  5.         return a > b;
  6.     }
  7. };
  8. template<typename T>
  9. class myless {
  10. public:
  11.     bool operator()(T a, T b) { // 二元函数对象
  12.         return a < b;
  13.     }
  14. };
  15. template<typename T, typename Com>
  16. bool compare(T a, T b, Com com)
  17. {
  18.     return com(a, b);
  19. }
  20. int main()
  21. {
  22.     cout << compare(1, 2, mygreater<int>()) << endl;;
  23.     cout << compare(1, 2, myless<int>()) << endl;;
  24. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万有斥力

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表