加入收藏 收藏网站 设为首页 设为首页
招生考试网
学历类| 阳光高考 研 究 生 自学考试 成人高考 专 升 本 中考会考 外语类| 四 六 级 职称英语 商务英语 公共英语 日语能力
资格类| 公 务 员 报 关 员 银行从业 司法考试 导 游 证 教师资格 财会类| 会 计 证 经 济 师 会计职称 注册会计 税 务 师
工程类| 一级建造 二级建造 造 价 师 造 价 员 咨 询 师 监 理 师 医学类| 卫生资格 执业医师 执业药师 执业护士 国际护士
计算机| 等级考试 软件水平 应用能力 其它类| 书画等级 美国高考 驾 驶 员 书法等级 少儿英语 报 检 员 单 证 员 出国留学
 招生考试网 - 计算机等级考试 - 考试辅导 - 正文

 
C++中使用指针调用 “类”的成员函数
来源:fjzsksw.com 2010-1-19 编辑:zhoupanyu 【字体:小 大】
在编程工作中常会遇到在一个“类”中通过函数指针调用成员函数的要求,如,当在一个类中使用了C++标准库中的排序函数qsort时,因qsort参数需要一个“比较函数”指针,如果这个“类”使用某个成员函数作“比较函数”,就需要将这个成员函数的指针传给qsort供其调用。本文所讨论的用指针调用 “类”的成员函数包括以下三种情况

 

  class Test3 //一个有定义的类。

  {

  public:

  //...

  void (* memberfun)();

  void Memberfun1( void (* f2)( ) ) { f2( ) ;} //成员函数1调用成员函数//2。

  void Memberfun2( );//成员函数2。

  //…

  };

  class Test4: virtual Test3 ,Test2 //一个有virtual继承的类(derivative class)。

  {

  public:

  void Memberfun1( void (* f2)( ) ) { f2( ) ;}

  };

  class Test5: Test3,Test2 //一个继承类(derivative class)。

  {

  public:

  void Memberfun1( void (* f2)( ) ) { f2( ) ;}

  };

  int main()

  {

  std::cout <<"一般函数指针长度= "<< sizeof(void(*)()) << '\n';

  std::cout <<"-类的成员函数指针长度-"<<'\n'<<'\n';

  std::cout <<"Test3类成员函数指针长度="<< sizeof(void(Test3::*)())<<'\n'<<'\n';

  std::cout <<"Test5类成员函数指针长度="<<sizeof(void (Test5:: *)())<<'\n';

  std::cout <<"Test4类成员函数指针长度="<<sizeof(void (Test4:: *)())<<'\n';

  std::cout <<"Test类成员函数指针长度="<<sizeof(void(Test::*)()) <<'\n';

  return 0;

  }

  输出结果为(VC++6.0编译,运行于Win98操作系统,其他操作系统可能有所不同):

  一般非成员函数指针长度= 4

  -类的成员函数指针长度-

  Test3类成员函数指针长度=4

  Test5类成员函数指针长度=8

  Test4类成员函数指针长度=12

  Test类成员函数指针长度=16

  以上结果表明,在32位Win98操作系统中,一般函数指针的长度为4个字节(32位),而类的成员函数指针的长度随类的定义与否、类的继承种类和关系而变,从无继承关系类(Test3)的4字节(32位)到有虚继承关系类(Virtual Inheritance)(Test4)的12字节(96位),仅有说明(declaration)没有定义的类(Test)因为与其有关的一些信息不明确成员函数指针最长为16字节(128位)。显然,与一般函数指针不同,指向“类”的成员函数的指针不仅包含成员函数地址的信息,而且包含与类的属性有关的信息,因此,一般函数指针和类的成员函数指针是根本不同的两种类型,当然,也就不能用一般函数指针直接调用类的成员函数,这就是为什么本文开始提到的三种情况编译出错的原因。尽管使用较早版本的编译软件编译仍然可以通过,但这会给程序留下严重的隐患。

  至于为什么同样是指向类的成员函数的指针,其长度竟然不同,从32位到128位,差别很大,由于没有看到微软官方的资料只能推测VC++6.0 在编译时对类的成员函数指针进行了优化,以尽量缩短指针长度,毕竟使用128位或96位指针在32位操作系统上对程序性能会有影响。但是,无论如何优化,类的成员函数指针包含一定量的对象(Objects)信息是确定的。其他的操作系统和编译软件是否进行了类似的处理,读者可以用以上程序自己验证。

 



 
网站版权与免责声明
①由于各方面情况的不断调整与变化,本网所提供的相关信息请以权威部门公布的正式信息为准.
②本网转载的文/图等稿件出于非商业性目的,如转载稿涉及版权等问题,请在两周内来电联系.
最新文章
热门文章

报名考试
全国 | 黑龙江 | 吉林 | 辽宁 | 内蒙古
青海 | 宁夏 | 甘肃 | 新疆 | 陕西
西藏 | 北京 | 天津 | 河北 | 山东
江苏 | 安徽 | 河南 | 上海 | 浙江
福建 | 广东 | 山西 | 湖南 | 湖北
江西 | 广西 | 海南 | 云南 | 贵州
四川 | 重庆
分省高校计算机考试
黑龙江 | 吉林 | 辽宁 | 内蒙古 | 河北
北京 | 天津 | 新疆 | 甘肃 | 宁夏
青海 | 陕西 | 山西 | 河南 | 山东
江苏 | 安徽 | 浙江 | 福建 | 广东
海南 | 广西 | 江西 | 湖北 | 湖南
四川 | 上海 | 重庆 | 贵州 | 云南
西藏
成绩查询
报考指南
试题答案
模拟试题
考试辅导
计算机一级 | 计算机二级 | 计算机三级 | 计算机四级
经验交流
高校计算机