1、直接上代码
#include <iostream>
#include <string>
using namespace std;
class Test
{
public:
void print(string name)
{
cout << "Hello," << name << endl;
}
};
typedef void (Test::*PointPrint)(string);
int main()
{
Test *t = new Test();
PointPrint p = &Test::print;
(t->*p)("Boy");
Test t2;
(t2.*p)("Girl");
return 0;
}
输出结果:
Hello,Boy
Hello,Girl
2、解读类成员函数指针的定义
typedef void (Test::*PointPrint)(string);
可以这么理解*PointPrint表示这是一个指针,void (*PointPrint)(string)也容易理解:指向函数的指针,再加上Test::就可以理解为指向Test类成员函数的指针了。
3、解读赋值
PointPrint p = &Test::print;
我们都知道,在C语言/C++也是,函数名就是指向函数的指针,在这里为什么还要使用&取一次地址呢?
成员函数的类名和普通的成员变量是一样的,不再是一个指针;如果你把&去掉,编译器就会提示你:请使用“&Test::print”创建指向成员的指针;
4、调用方式
原来->*和.*都是操作符,具有左结合性
->* ptr to member select(指向成员操作的指针) ptr ->* ptr_to_member
.* ptr to member select(指向成员操作的指针) obj .*
5、既然有类成员函数指针,那么有类成员变量指针么?
class Test
{
public:
static int i;
void print(string name)
{
cout << "Hello," << name << endl;
}
};
typedef int Test::*I;
但是在像下面一样赋值的时候
I i = &Test::i;
却报不能进行类型转换的编译错误,虽然感觉着东西没啥用处,但是有空还是研究下