在具体介绍指向成员函数的指针之前先简单介绍一下指向成员函数的指针与指向普通函数的指针的区别
指向成员函数的指针不仅要匹配将要指向的函数的参数类型,个数和返回值类型,还要匹配指向的成员函数所属的类
指向普通函数的指针变量定义如下:
返回值类型 (* 指针名)();
而指向成员函数的指针的定义如下:
返回值类型 (类名::*指针名)();
指向成员函数的指针的初始化:
指针名=&类名::函数名;
指向成员函数的指针的调用:
(对象名.*指针名)();
看一个具体的程序来开始理解:
#include<iostream>
using namespace std;
class Box
{
public:
Box(float l,float w,float h):length(l),width(w),height(h)
{
}
float volume()
{
return length*width*height;
}
float area()
{
return 2*(length*width+length*height+width*height);
}
private:
float length,width,height;
};
int main()
{
Box box(1,2,3);
float (Box::*p)(); //声明指向成员函数的指针:可以把(Box::*p)看做只是用来存放函数名称的指针,后面的()正好与函数名后面的括号相对应
p=&Box::volume; //初始化指向成员函数的指针:看到了吧,哲理只是把函数名的地址赋值给指针
cout<<"The volume of box is:"<<(box.*p)()<<endl; //指向成员函数的指针的调用:(box.*p)只是相当于函数名称
float (Box::*q)();
q=&Box::area;
cout<<"The area of the box is:"<<(box.*q)()<<endl;
return 0;
}
注意:
1.在对指向成员函数的指针初始化时要把类的函数赋值给指针,而不是把对象的函数赋值给指针
如 p=&box::volume 是错误的
2.调用指向成员函数的指针时,要通过(对象名.*指针),而不是(类名.*指针)