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

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

类成员指针

  1. 概念

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

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

  2. 数据成员指针

    ①.定义

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

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

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

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

    ②.数据成员指针的使用

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

    在这里插入图片描述

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

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

在这里插入图片描述

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

    ②.成员函数指针的使用

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

在这里插入图片描述

③.使用别名

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

在这里插入图片描述

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

    ①.概念

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

    ②.function 与成员函数指针

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

在这里插入图片描述

③.mem_fn 与成员函数指针

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

在这里插入图片描述

④.bind 与成员函数指针

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

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值