可调用对象
在C++中,可以像函数一样调用的有:普通函数、类的静态成员函数、仿函数、lambda函数、类的非静态成员函数、可被转换为函数的类的对象,统称可调用对象或函数对象。
因为可调用对象有类型,可以用指针存储它们的地址,可以被引用。从而调用他。
#include <iostream>
using namespace std;
using Fun = void(int, const string&);
Fun show;
int main()
{
void(*fp1)(int, const string&) = show;
Fun* fp2 = show;
void(&fr1)(int, const string&) = show;
Fun& fr2 = show;
show(10086, "您好,请问有什么可以帮到您的?");
fp1(10086, "您好,请问有什么可以帮到您的?");
fp2(10086, "您好,请问有什么可以帮到您的?");
fr1(10086,"您好,请问有什么可以帮到您的?");
fr2(10086, "您好,请问有什么可以帮到您的?");
}
void show(int workId,const string& msg)
{
cout << "工号" << workId << ":" << msg << endl;
}
#include <iostream>
using namespace std;
using Fun = void(int, const string&);
class User
{
public:
static void desc(int age, const string& name)
{
cout << "age: " << age << "name " << name << endl;
}
};
int main()
{
void(*fp1)(int,const string&) = User::desc;
void(&fr1)(int, const string&) = User::desc;
Fun* fp2 = User::desc;
Fun& fr2 = User::desc;
User::desc(22, "Name");
fp1(22, "Name");
fr1(22, "Name");
fp2(22, "Name");
fr2(22, "Name");
}
仿函数的本质是类,调用的代码像函数。
#include <iostream>
using namespace std;
struct Fun
{
void operator()(int age, const string& name)
{
cout << "age " << age << "name " << name << endl;
}
};
int main()
{
Fun aa;
aa(12,"Name");
Fun()(12, "Name");
Fun& bb = aa;
bb(12, "Name");
}
lambda函数的本质是仿函数,仿函数的本质是类。
#include <iostream>
using namespace std;
int main()
{
auto lb = [](int age, const string& name)
{
cout << "age " << age << "name " << name << endl;
};
auto& lr = lb;
lb(12,"Name");
lr(12, "Name");
}
类的非静态成员函数有地址,但是,只能通过类的对象才能调用它,所以,C++对它做了特别处理。
类的非静态成员函数只有指针类型,没有引用类型,不能引用。
#include <iostream>
using namespace std;
class User
{
public:
void desc(int age, const string& name)
{
cout << "age " << age << "name " << name << endl;
}
};
int main()
{
User user;
void(User:: * fp1)(int, const string&) = &User::desc;
using pFun = void(User::*)(int, const string&);
pFun fp2 = &User::desc;
user.desc(12, "Name");
(user.*fp1)(12, "Name");
(user.*fp2)(12, "Name");
}