要想弄清楚类的函数成员指针,先得了解什么是函数指针。
例如:有一个函数 int add(int a, int b) {return a+b}; 你可以直接使用add(2, 4)来调用该函数;当然,你也可以声明一个指向该函数的指针,再通过指针去调用函数:
int (*padd)(int , int) = add; //函数名就代表地址,也可以用&add
padd(2, 4);
这里的padd就是函数指针,由于是指针变量,占用内存的4个字节,具体存放的是代码区中add函数的代码,由于函数名就表示函数的入口地址,所以padd就指向该函数,之后就可以用该函数指针去代替具体的函数。
声明函数指针时有几个问题需要注意一下:
要用"()"将声明的指针括起来,之后紧跟的是函数的参数(只需写明参数类型即可),然后就是函数的返回值。编译器在解释这个声明时会依据操作符的优先级,首先是第一个括号里面的内容,它是一个指针,再接下来是第二个括号,编译器会自动把它解释成函数参数,因为找不到其它合理的解释了,最后就是这个类型是int型的,大概过程就是这样。
弄懂了函数指针之后,再来说说类的成员函数指针。顾名思义,成员函数指针就是有一个指针指向该类的某一个成员函数:
ClassPointer.h
class Point
{
private:
int x, y;
public:
static int count;
Point(int _x, int _y);
Point(Point &p);
~Point();
int getX() const;
int getY() const;
static int getCount();
};
ClassPointer.cpp
int Point::count = 0;
Point::Point(int _x, int _y) : x(_x), y(_y)
{
count++;
}
Point::Point(Point &p) : x(p.x), y(p.y)
{
count++;
}
Point::~Point()
{
count--;
}
int Point::getX() const
{
return x;
}
int Point::getY() const
{
return y;
}
int Point::getCount()
{
return count;
}
mainClass.cpp
int main()
{
Point p1(4, 6);
int (Point::*pgetX)() const = Class::getX;
int (Point::*pgetY)() const = Class::getY;
int (*pgetCount)() = Point::getCount; //类Point的静态成员函数的指针
cout<<(p1.*pgetX)()<<endl;
return 0;
}
在上面这段代码中,int (Point::*pgetX)() const = Point::getX 声明了一个指针变量pgetX,该指针变量指向Point类的成员函数getX。仔细留意一下就会发现,类成员函数指针的声明和一般函数指针有个很明显的区别:在声明指针这个变量和取成员函数地址前都要加上类名和作用域分辨符("::")。接下来就可以使用具体的对象名去调用这个函数指针,如:(p1.*pgetX)();
上面就是最基本的函数指针的用法,希望大家都够作为参考;更加深入的函数指针的内部原理我会陆续更新的。