您的位置:首页 > 娱乐 > 明星 > 深圳网站制作公司专业网站_莱芜贴吧论坛_互联网公司_google引擎入口

深圳网站制作公司专业网站_莱芜贴吧论坛_互联网公司_google引擎入口

2024/12/23 10:39:04 来源:https://blog.csdn.net/weixin_43459437/article/details/143504212  浏览:    关键词:深圳网站制作公司专业网站_莱芜贴吧论坛_互联网公司_google引擎入口
深圳网站制作公司专业网站_莱芜贴吧论坛_互联网公司_google引擎入口

函数对象

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

函数指针

指向一个函数的指针,可以动态调用不同的函数。

#include <iostream>// 一个普通的函数
void hello() {std::cout << "Hello, World!" << std::endl;
}
int add(int a, int b) {return a + b;
}
int main() {// 声明一个函数指针void (*func_ptr)() = hello;  // func_ptr 指向 hello 函数func_ptr();  // 调用 hello 函数// 声明一个函数指针,指向返回 int 类型的函数int (*add_ptr)(int, int) = add;std::cout << "Sum: " << add_ptr(3, 4) << std::endl;  // 调用 add 函数return 0;
}

函数指针的劣势

  • 代码中使用C++中的模板,调用使用函数指针调用函数。

  • 将函数指针传入compare时,编译器并不知道函数是什么。所以不能进行内联,导致会有函数的调用开销

bool mygreater(int a, int b)
{return a > b;
}
bool myless(int a, int b)
{return a < b;
}
template<typename T, typename Com>
bool compare(T a, T b, Com com)
{return com(a, b);
}int main()
{cout << compare(1, 2, mygreater) << endl;;cout << compare(1, 2, myless) << endl;;
}

函数对象(仿函数

重载了operator()的对象,可以如同函数一样被调用。

#include <iostream>// 定义一个仿函数类
class Adder {
publicint operator()(int a, int b) {return a + b ;}
};int main() {Adder add;  // 创建一个 Adder 对象,并初始化值为 10std::cout << "Sum: " << add(3, 4) << std::endl;  // 调用 operator(),输出 17 (3 + 4 + 10)return 0;
}

函数对象的优势

  • 传入函数的是一个对象,编译器知道函数是什么,因此可以进行内联,提高函数调用效率
template<typename T>
class mygreater {
public:bool operator()(T a, T b) { // 二元函数对象return a > b;}
};template<typename T>
class myless {
public:bool operator()(T a, T b) { // 二元函数对象return a < b;}
};
template<typename T, typename Com>
bool compare(T a, T b, Com com)
{return com(a, b);
}int main()
{cout << compare(1, 2, mygreater<int>()) << endl;;cout << compare(1, 2, myless<int>()) << endl;;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com