在algorithm算法中经常会碰到传递函数指针的情况,在这里面他们把这种类型叫做谓词,当然lambda表达式就是
谓词的一种。这次内容要说的当类的成员函数做为谓词时,是什么样子的,如何使用呢?
类中一共会有三种函数:
1.非静态非虚函数
非静态非虚函数的函数指针,因为成员函数里面会传递this指针,所以就算是函数指针,也必须有对象来调用他们。
非静态非虚函数的函数指针格式:
返回类型(类名::*指针名)(参数)=类名::&函数名; //至于最后的函数名前需不需要加&,我认为都可以的。当然,加上更加规范。
使用时:
对于指向类成员函数的函数指针,调用时必须传入一个类对象的this指针,所以必须有类实体调用
格式:
(pa->*指针名)(参数); pa是指向对象的指针 //同样,指针名前*是不是必要的,去尝试。
(a.*指针名)(参数); a是一个对象 //同上
2.类中静态成员函数
静态成员函数并不需要this指针,那么它和非静态非虚函数会是相同的调用方式吗?
定义方式:
返回值(*p)(参数)=&类名::函数名; //和全局函数定义方式一样,赋值方式和非静态非虚函数相同
使用:由于不需要传递this指针,所以使用和全局函数相同
指针名(参数);
3.虚函数
虚函数呢,它为了运行时多态,所以我们在编译期间根本无法知道调用哪一个函数,更不用说取得地址了。
如果取了虚函数的地址,据说会取到索引值。当然,有兴趣的可以尝试哈。
所以呢,取虚函数的地址是没有意义的。