可被转换成函数指针的类对象 (拓展于可调用对象)

什么是可被转换成函数指针的类对象呢,用下面的例子介绍一下

using func_ptr = void(*)(int, string);

struct Test
{
    // 将类对象转换为函数指针
    operator func_ptr()
    {
        return print;
    }

    static void print(int a, string b)
    {
        cout << "name: " << b << ", age: " << a << endl;
    }
};

主干代码:
   operator func_ptr()
   {
        return print;
   }

模板: operator 想转换成的函数指针类型 ()  括号内永远都是什么都不用写
      {
            return  调用的函数指针 //和上面的函数指针类型必须一模一样
       }

在这里为什么必须要有一个return 调用的函数指针呢,因为 我们是要实例化出一个对象,从而用对象加()进行初始化和调用 ,就像下面这个例子,简洁的理解就是:我们用func_ptr 告诉大家我们要将类对象转换为什么类型的指针,return后面的就是 我们要将示例出的对象=调用具体哪个函数 (因为将类对象转换成函数指针  我们将对象示例化出来后 相当于调用了某个函数 ),所以func_otr和print的类型必须一模一样

理解完上面问题后,我们想一个问题:return 后面 可以是类成员非静态函数吗 答案是:No!,因为类成员非静态函数是不属于类的,属于对象的,当我们不实例化出一个对象时 这个函数是不存在的 ,而静态函数是属于类的,类存在 静态函数即存在。若在print函数前的static删除,就会报错

#include <iostream>
#include <string>
#include <vector>
using namespace std;

using func_ptr = void(*)(int, string);
struct Test
{
    static void print(int a, string b)
    {
        cout << "name: " << b << ", age: " << a << endl;
    }

    // 将类对象转换为函数指针
    operator func_ptr()
    {
        return print;
    }
};

int main(void)
{
    Test t;
    // 对象转换为函数指针, 并调用
    t(19, "Monkey D. Luffy");

    return 0;
}

 实例化一个类 就等价于 调用了一个函数(并且可以传参)

当然,像下面这个例子复杂一点 

#include <iostream>
#include <string>
#include <vector>
using namespace std;

using func_ptr = void(*)(int, string);
struct Test
{
    static void print(int a, string b)
    {
        cout << "name: " << b << ", age: " << a << endl;
    }

    // 将类对象转换为函数指针
    operator func_ptr()
    {
        return print;
    }
    
    void operator()(string ak)
    {
    	cout<<ak<<endl;
	} 
};

int main(void)
{
    Test t;
    // 对象转换为函数指针, 并调用
    t(19, "Monkey D. Luffy");
    
    Test e;
    e("Doggy"); 

    return 0;
}

这个类有仿函数,也可以将类转换为函数指针,同理,我们传入一个参时就调用仿函数,传入两个参数时就调用转换函数指针,非常灵活。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值