谈函数指针(全局/类成员函数)和函数对象
2007-08-31 05:57
375 查看
[align=center]谈函数指针(全局/类成员函数)和函数对象[/align]
[align=center][/align]
[align=center]作者:Ackarlix[/align]
[align=left] 一. 函数指针类型为全局函数.[/align]
[align=left] [/align]
[align=left] 二. 函数指针类型为类成员函数.[/align]
[align=left] [/align]
[align=left] 三. 函数对象 (Function object)[/align]
[align=left] [/align]
[align=left] 虽然传递函数指针被广泛应用于事件驱动系统中,以此实现回调函数通过指针来调用。但 C++ 还是提供了另外一种可供选择的办法,即函数对象,利用它可以避免使用函数指针。这样做有几个优点。首先, 因为对象可以在内部修改而不用改动外部接口,因此设计更灵活,更富有弹性。函数对象也具备有存储先前调用结果的数据成员。。 此外,编译器可以内联函数对象,从而进一步增强性能。函数对象可以具体表达依赖成员模板的通用算法 , 这些算法借助普通的函数指针难以完成。例用函数对象实现了一个通用的 Negation 算法操作:[/align]
[align=left] STL 库中定义了很多函数对象以供相关算法调用,如 模板化的函数对象 greater<> 或者 less<>:[/align]
[align=left] vector vi;[/align]
[align=left] //.. 填充向量[/align]
[align=left] sort(vi.begin(), vi.end(), greater() );// 降序 (descending)[/align]
[align=left] sort(vi.begin(), vi.end(), less() ); // 升序 (ascending)[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]本文来源:http://blog.csdn.net/ackarlix/[/align]
[align=center][/align]
[align=center]作者:Ackarlix[/align]
[align=left] 一. 函数指针类型为全局函数.[/align]
以下是引用片段: #include "stdafx.h" #include using namespace std; class TestAction; typedef void (*fp)(int); void Drink(int i) { cout<<"No. "< } void Eat(int i) { cout<<"No. "< } class TestAction { public: fp testAct; void TestAct(int i) { if (testAct != NULL) { testAct(i); } } }; int main(int argc, char* argv[]) { TestAction doact; doact.testAct = &Drink; doact.TestAct(0); doact.TestAct(1); doact.TestAct(2); doact.testAct = &Eat; doact.TestAct(0); doact.TestAct(1); doact.TestAct(2); return 0; } |
[align=left] 二. 函数指针类型为类成员函数.[/align]
以下是引用片段: #include "stdafx.h" #include using namespace std; class Action; class TestAction; // 函数指针类型为类 Action 的成员函数 typedef void (Action::*fp)(int); class Action { public: void Drink(int i) { cout<<"No. "< } void Eat(int i) { // 本文转自 C++Builder 研究 - http://www.ccrun.com/article.asp?i=1005&d=sc37og cout<<"No. "< } }; class TestAction { public: // 定义一个函数指针 fp testAct; //Action 对象实例 , 该指针用于记录被实例化的 Action 对象 Action * pAction; void TestAct(int i) { if ((pAction != NULL) && (testAct != NULL)) { // 调用 (pAction->*testAct)(i); } } }; int main(int argc, char* argv[]) { Action act; TestAction doact; doact.pAction = &act; doact.testAct = Action::Drink; doact.TestAct(0); doact.TestAct(1); doact.TestAct(2); doact.testAct = Action::Eat; doact.TestAct(0); doact.TestAct(1); doact.TestAct(2); return 0; } |
[align=left] 三. 函数对象 (Function object)[/align]
以下是引用片段: #include "stdafx.h" #include #include using namespace std; class Action; class Drink; class Eat; class TestAction; class Action { public: int operator()(int i) { Act(i); return i; } virtual void Act(int i) = 0; }; class Drink : public Action { void Act(int i) { cout<<"No. "< } }; class Eat : public Action { void Act(int i) { cout<<"No. "< } }; class TestAction { public: void TestAct(int i, Action& testAct) { testAct(i); } }; int main(int argc, char* argv[]) { TestAction doact; doact.TestAct(0, Drink()); doact.TestAct(1, Drink()); doact.TestAct(2, Drink()); doact.TestAct(0, Eat()); doact.TestAct(1, Eat()); doact.TestAct(2, Eat()); return 0; } |
[align=left] 虽然传递函数指针被广泛应用于事件驱动系统中,以此实现回调函数通过指针来调用。但 C++ 还是提供了另外一种可供选择的办法,即函数对象,利用它可以避免使用函数指针。这样做有几个优点。首先, 因为对象可以在内部修改而不用改动外部接口,因此设计更灵活,更富有弹性。函数对象也具备有存储先前调用结果的数据成员。。 此外,编译器可以内联函数对象,从而进一步增强性能。函数对象可以具体表达依赖成员模板的通用算法 , 这些算法借助普通的函数指针难以完成。例用函数对象实现了一个通用的 Negation 算法操作:[/align]
以下是引用片段: #include "stdafx.h" #include using namespace std; class Negate { public: template T operator()(T t) const { return -t; } }; void Callback(int n, const Negate& neg) // 传递一个函数对象 { n = neg(n); // 调用重载的 () 操作 来对 n 进行 negate 操作 cout << n << endl; } int main(int argc, char* argv[]) { // 调用方式一 Callback(5, Negate()); // 调用方式二 Negate neg; cout << neg(9.99999) << endl; cout << neg(__int32(39999999)) << endl; return 0; } |
[align=left] vector vi;[/align]
[align=left] //.. 填充向量[/align]
[align=left] sort(vi.begin(), vi.end(), greater() );// 降序 (descending)[/align]
[align=left] sort(vi.begin(), vi.end(), less() ); // 升序 (ascending)[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]本文来源:http://blog.csdn.net/ackarlix/[/align]
相关文章推荐
- 谈函数指针(全局/类成员函数)和函数对象
- this指针指向当前调用对象,只是用于类的非静态成员函数。静态函数和全局函数 无当前对象,无this指针。
- c++指针深入全面总结--包括对象数据成员和成员函数的指针
- c++指向对象成员函数的指针
- 【C++总结】函数形参,返回const对象与非const对象,成员函数,函数指针
- MFC 外部普通函数获取类对象指针来调用类的成员函数
- 类和对象 , 四个默认成员函数及运算符重载 , 隐含的this指针
- C++对象模型之成员函数的指针
- 函数指针(全局函数/类成员函数)和函数对象
- 函数指针传递的两种环境(全局函数与类成员函数)
- 指向对象成员变量的指针和指向成员函数的指针
- C++的 成员函数指针, 静态函数指针,全局函数指针 区别
- 用对象和用指向基类的指针访问成员函数
- this 指针的地址--调用成员函数的所在对象的起始地址
- 谈函数指针(全局/类成员函数)和函数对象
- c++ 全局函数指针和类成员函数指针
- 静态成员函数、this指针、对象指针和动态对象使用小结
- C++调用空指针对象的成员函数——静态绑定与动态绑定
- 第五周 阅读程序 在 main 函数中,可设置指向对象public 成员、对象函数还有对象的指针
- C++成员函数指针及C++函数对象