C++ 可调用对象总结(三) 成员函数指针

前文回顾:
C++ 可调用对象总结(一) 函数对象
C++ 可调用对象总结(二) lambda表达式

类成员指针

  1. 概念

    ①.成员指针:成员指针是指可以指向类的非静态成员的指针,成员指针指向的是类的成员,而非类的对象。

    ②.成员指针类型:成员指针的类型包括了类的类型以及成员的类型;成员指针初始化时令其指向了类的成员,直到使用成员指针时才会提供成员所属对象。

  2. 数据成员指针

    ①.定义

    声明成员指针也是使用 * 表示当前的名字是个指针,但还必须包含成员所属类,即在 * 之前加 classname::。

    const string Screen::*pdata;//表示 pdata 是一个指向 Screen 类的 const string 成员的指针
    

    成员指针赋值时,使用 & 运算符作用于类的成员,而不是类的对象。

    const string Screen::*pdata = &Screen::contents;// pdata 指向 Screen 类的成员 contents
    

    ②.数据成员指针的使用

    成员指针指向了类的成员,解引用后得到了该成员,然后通过对象访问成员。

    C++ 可调用对象总结(三) 成员函数指针_第1张图片

    ③.返回数据成员指针的函数

    常规的访问控制规则对成员指针同样有效,若数据成员是私有的,则不能在类的外部获取数据成员的指针,通常可以使用静态成员函数返回。

C++ 可调用对象总结(三) 成员函数指针_第2张图片

  1. 成员函数指针

    ①.定义

    类似指向类数据成员的指针,也可以定义指向成员函数的指针。

    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;
    };
    

    ②.成员函数指针的使用

    类似数据成员指针。成员函数指针指向了类的成员,解引用后得到了该成员函数,然后通过对象调用成员函数。声明成员函数指针和进行函数调用时,必须加括号。

C++ 可调用对象总结(三) 成员函数指针_第3张图片

③.使用别名

可以使用类型别名来定义成员函数指针。

C++ 可调用对象总结(三) 成员函数指针_第4张图片

  1. 成员函数指针用作可调用对象

    ①.概念

    成员函数指针的调用必须绑定到一个特定对象上,因此成员函数指针不是一个可调用对象,不支持函数调用运算符。

    ②.function 与成员函数指针

    可以使用标准库模版 function 生成一个可调用对象,可调用对象的第一个形参必须表示该成员是在哪个对象上执行的,且必须指明对象是否以指针或者引用传入的。

C++ 可调用对象总结(三) 成员函数指针_第5张图片

③.mem_fn 与成员函数指针

也可以使用标准库 mem_fn 生成一个可调用对象。与 function 不同的是,可调用对象的类型可以由编译器进行推断,且可作用对象可以是指针也可以是引用。

C++ 可调用对象总结(三) 成员函数指针_第6张图片

④.bind 与成员函数指针

还可以使用 bind 从成员函数生成一个可调用对象。类似 function ,bind 的第一个参数也必须显示指定可作用对象;类似 mem_fn ,bind 传入的可作用对象可以是指针也可以是引用。

C++ 可调用对象总结(三) 成员函数指针_第7张图片

你可能感兴趣的:(c++,c++,指针)