c++技巧----函数指针的枝枝节节
帐 号: 注册帐号
密 码:  找回密码
      记住用户名和密码
c++技巧----函数指针的枝枝节节

类有两类成员:函数成员和数据成员。同样,也就有两种类别的成员指针:成员函数指针和数据成员指针。后者不太常见,因为,一般来说,类是没有公共数据成员的。当使用传统C代码的时候,数据成员指针才是有用的,因为传统C代码中包含的结构体或类是具有公开数据成员的。

  在C++中,成员指针是最为复杂的语法结构之一;可是,这却是一个非常强大而重要的特性。它们可以使您在不知道这个函数的名字的前提下调用一个对象的成员函数。这是非常方便的回调实现。同样的,你可以使用一个数据成员指针来监测和修改数据成员的值,而不必知道它的名字。

指向数据成员的指针
  虽然成员指针的语法可能会显得有点混乱,但是它与普通指针的形式比较一致和类似,只需要在星号之前加上类名::即可。例如,如果一个普通的整形指针如下所示:

int * pi;

  那么,你就可以按照下面的方式来定义一个指向类A的整形成员变量的指针:
int A::*pmi; /* pmi is a pointer to an int  member of A*/

  你需要按照这样的方式初始化成员指针:
class A
{
public:
  int num;
  int x;
};
int A::*pmi = & A::num; /* 1 */

  标号1的语句声明了一个指向类A的整形成员的指针,它用A类对象中的成员变量num的地址实现了初始化。使用pmi和内置操作符.*,你可以监测和修改任何一个A类型的对象中的num的值。


A a1, a2;
int n=a1.*pmi; /* copy a1.num to n */
a1.*pmi=5; /* assign the value 5 to a1.num */
a2.*pmi=6; /* assign the value 6 to a2.num */


  如果有一个指向A的指针,你必须使用->*操作符:


A * pa=new A;
int n=pa->*pmi;  
pa->*pmi=5;


成员函数指针
  它由成员函数的返回类型,类名加上::,指针名称,函数的参数列表几部分组成。例如,类型A的一个成员函数返回一个int,无参数,那么其函数指针应该定义如下(注意两对括号是必不可少的):


class A  
{
public:
  int func ();  
};
int (A::*pmf) ();


  换句话说,pmf是一个指向类A的成员函数的指针,类A的成员函数返回int指针,无参数。事实上,一个成员函数指针看起来和普通的函数指针相似,除了它包含函数名加上::操作符。您可以使用.*操作符来调用pmf指向的成员函数:


pmf=&A::func;
A a;
(a.*pmf)();  /* invoke a.func() */


  如果有的是一个对象的指针,你必须使用->*操作符:
A *pa=&a;
(pa->*pmf)();  /*calls pa->func() */

  成员函数指针遵循多态性。因此,如果你通过这样一个指针调用虚成员函数,则会实现动态调用。但是需要注意的是,你不能将成员函数指针指向一个类的构造函数或者析构函数的地址。

copyright:2016-2020|邮箱:imalib@vip.163.com

蜀ICP备16020986号