动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ C/C++教程 ]的信息



本月文章推荐
.创建SvcHost.exe调用的服务原理与.
.如何用C++编程获得某台机器的IP地.
.自动化基础概念之“COM组件与接口.
.用c++语言实现基本的数据结构(1.
.WindowsNT下Service的编程.
.如何捕获VCL没有处理的Windows消.
.Eratosthenes筛法求素数.
.任务条状态区的应用.
.不调用拨号网络在程序中拨号.
.TC(V2.0)使用指南.
.行==列==对角线 ◎ 魔幻矩阵.
.C语言编程常见问题解答之常用函数.
.Code Style(代码的风格).
.PCI.
.动态汉化Windows技术的分析.
.指针与数组.
.一个简单的一箭穿心程序.
.内核模块的编译文件.
.伪随机数生成及在VC++中的实现.
.用C++制作自己的游戏修改器(下).

谈函数指针(全局/类成员函数)和函数对象

发表日期:2008-3-8 |


  函数指针(全局函数/类成员函数)、函数对象(Function object)   一. 函数指针类型为全局函数. 以下是引用片段:
  #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;
  }
  二. 函数指针类型为类成员函数. 以下是引用片段:
  #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;
  }
  三. 函数对象 (Function object) 以下是引用片段:
  #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;
  }
  虽然传递函数指针被广泛应用于事件驱动系统中,以此实现回调函数通过指针来调用。但 C++ 还是提供了另外一种可供选择的办法,即函数对象,利用它可以避免使用函数指针。这样做有几个优点。首先, 因为对象可以在内部修改而不用改动外部接口,因此设计更灵活,更富有弹性。函数对象也具备有存储先前调用结果的数据成员。。 此外,编译器可以内联函数对象,从而进一步增强性能。函数对象可以具体表达依靠成员模板的通用算法 , 这些算法借助普通的函数指针难以完成。例用函数对象实现了一个通用的 Negation 算法操作:
以下是引用片段:
  #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;
  }   STL 库中定义了很多函数对象以供相关算法调用,如 模板化的函数对象 greater<> 或者 less<>:   vector vi;   //.. 填充向量   sort(vi.begin(), vi.end(), greater() );// 降序 (descending)   sort(vi.begin(), vi.end(), less() ); // 升序 (ascending)

上一篇:C/C++中动态链接库的创建和调用 人气:362
下一篇:数据结构C语言实现系列——队列 人气:321
浏览全部C/C++的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-6 飞天论坛FTBBS ASP v6.3 Build 0
2008-7-6 飞天论坛FTBBS ASP v6.3 Build 0
2008-7-6 飞天论坛FTBBS ASP v6.8 Build 0
2008-7-6 讯息内容管理系统 v2.1
2008-7-6 三五电影程序 v2.0
2008-7-6 神鹰腾讯小说小偷 v3.0
2008-7-6 EasyIDE Framework v1.0 Build 2
2008-7-6 品告CMS系统(电影版) v0.9
2008-7-6 QQ自动登录器 C# 源码 v1.0
2008-7-5 AgileMessenger即时通讯工具 v1.
2008-7-5 GoodCalculator2.0版固件计算器
2008-7-5 RepoName源地址搜索工具 v1.21b
2008-7-5 AgileMessenger即时通讯工具 v1.
2008-7-5 TouchCopy多媒体管理软件 v3.13完
2008-7-5 VideosTone视频铃声 v1.1汉化破解
2008-7-5 TouchPad触摸板 v4.44破解版
2008-7-5 VideosTone破解补丁 v1.0
2008-7-5 Feeds GoogleReader客户端 v0.4.3


  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報