前文回顾:
C++ 可调用对象总结(一) 函数对象
C++ 可调用对象总结(二) lambda表达式
概念
①.成员指针:成员指针是指可以指向类的非静态成员的指针,成员指针指向的是类的成员,而非类的对象。
②.成员指针类型:成员指针的类型包括了类的类型以及成员的类型;成员指针初始化时令其指向了类的成员,直到使用成员指针时才会提供成员所属对象。
数据成员指针
①.定义
声明成员指针也是使用 * 表示当前的名字是个指针,但还必须包含成员所属类,即在 * 之前加 classname::。
const string Screen::*pdata;//表示 pdata 是一个指向 Screen 类的 const string 成员的指针
成员指针赋值时,使用 & 运算符作用于类的成员,而不是类的对象。
const string Screen::*pdata = &Screen::contents;// pdata 指向 Screen 类的成员 contents
②.数据成员指针的使用
成员指针指向了类的成员,解引用后得到了该成员,然后通过对象访问成员。
③.返回数据成员指针的函数
常规的访问控制规则对成员指针同样有效,若数据成员是私有的,则不能在类的外部获取数据成员的指针,通常可以使用静态成员函数返回。
成员函数指针
①.定义
类似指向类数据成员的指针,也可以定义指向成员函数的指针。
auot pmf = &Screen::get_cursor;//pmf 是一个指针,它可以指向 Screen 的成员函数 get_cursor
如果成员函数是 const 成员或者引用成员,则必须将 const 限定符或引用包含进来。
class Person
{
public:
Person(string s,int a):name(s),age(a){}
string GetName(){return name;}
int GetAge() const {return age;}
private:
string name;
int age;
Person p("张三",22);
//指向 GetAge 的成员函数指针
int (Person::*ptr_fun)() const = &Person::GetAge;
};
②.成员函数指针的使用
类似数据成员指针。成员函数指针指向了类的成员,解引用后得到了该成员函数,然后通过对象调用成员函数。声明成员函数指针和进行函数调用时,必须加括号。
③.使用别名
可以使用类型别名来定义成员函数指针。
成员函数指针用作可调用对象
①.概念
成员函数指针的调用必须绑定到一个特定对象上,因此成员函数指针不是一个可调用对象,不支持函数调用运算符。
②.function 与成员函数指针
可以使用标准库模版 function 生成一个可调用对象,可调用对象的第一个形参必须表示该成员是在哪个对象上执行的,且必须指明对象是否以指针或者引用传入的。
③.mem_fn 与成员函数指针
也可以使用标准库 mem_fn 生成一个可调用对象。与 function 不同的是,可调用对象的类型可以由编译器进行推断,且可作用对象可以是指针也可以是引用。
④.bind 与成员函数指针
还可以使用 bind 从成员函数生成一个可调用对象。类似 function ,bind 的第一个参数也必须显示指定可作用对象;类似 mem_fn ,bind 传入的可作用对象可以是指针也可以是引用。