WEB开发网
开发学院软件开发VC 直接调用类成员函数地址 阅读

直接调用类成员函数地址

 2010-07-25 20:45:42 来源:WEB开发网   
核心提示:一、成员函数指针的用法在C++中,成员函数的指针是个比较特殊的东西,直接调用类成员函数地址,对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换并直接调用,有了这些特殊的用法和严格的限制之后,类成员函数的指针实际上是变得没什么用了,但对成员函数来说,常规类型转换是通不过编译的

一、成员函数指针的用法

在C++中,成员函数的指针是个比较特殊的东西。对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换并直接调用。但对成员函数来说,常规类型转换是通不过编译的,调用的时候也必须采用特殊的语法。C++专门为成员指针准备了三个运算符: "::*"用于指针的声明,而"->*"和".*"用来调用指针指向的函数。比如:

class tt
  {
    public: void foo(int x){ printf("
%d
",x); }
  };
  typedef  void ( tt::* FUNCTYPE)(int );
  FUNCTYPE ptr = tt::foo; //给一个成员函数指针赋值.
  tt a;
  (a.*ptr)(5);  //调用成员函数指针.
  tt *b = new tt;
  (b->*ptr)(6); //调用成员函数指针.

注意调用函数指针时括号的用法,因为 .* 和 ->* 的优先级比较低,必须把它们和两边要结合的元素放到一个括号里面,否则通不过编译。不仅如此,更重要的是,无法为成员函数指针进行任何的类型转换,比如你想将一个成员函数的地址保存到一个整数中(就是取类成员函数的地址),按照一般的类型转换方法是办不到的.下面的代码:

DWORD dwFooAddrPtr= 0;
  dwFooAddrPtr = (DWORD) &tt::foo; /* Error C2440 */
  dwFooAddrPtr = reinterpret_cast (&tt::foo); /* Error C2440 */

你得到只是两个c2440错误而已。当然你也无法将成员函数类型转换为其它任何稍有不同的类型,简单的说,每个成员函数指针都是一个独有的类型,无法转换到任何其它类型。即使两个类的定义完全相同也不能在其对应成员函数指针之间做转换。这有点类似于结构体的类型,每个结构体都是唯一的类型,但不同的是,结构体指针的类型是可以强制转换的。有了这些特殊的用法和严格的限制之后,类成员函数的指针实际上是变得没什么用了。这就是我们平常基本看不到代码里有"::*", ".*" 和 "->*"的原因。

1 2 3 4 5 6  下一页

Tags:直接 调用 成员

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接