如有错误,还望指正。
在阅读书籍或者论坛的时候常常会遇到可调用对象的概念,很多人都没有深入的理解这个概念,甚至有人会觉得函数就是可调用对象就是函数,其实是不对的,在这里给大家做一下详细的解释。
可调用对象是c++长久以来存在的一个概念,大体可以分为4种,分别是:1.函数指针 2.仿函数 3.可以被隐式转换为函数指针的类对象
4.类的成员函数指针。
1.函数指针
#include<iostream>
using namespace std;
int fun(int a){ return a; };
int main()
{
using ftype = int(*)(int);
ftype fun1 = fun;
cout << fun1(3) << endl;
system("pause");
return 0;
}
ftype就是一个类型,fun1就是函数指针。
2.仿函数先简单讲一下仿函数这个概念,如果一个类中将运算符()重载,那这个类的类对象可以作为可调用对象。
#include<iostream>
using namespace std;
class example
{
public:
example(){};
~example(){};
void operator()(){ cout << "example" << endl; };
};
int main()
{
example e1;
e1();
system("pause");
return 0;
}
显然, 类对象e1可以像函数一样进行调用,此时e1也是一个可调用对象。注意,普通的函数并不是,但重载()运算符的类对象是。
输出就是example。
3.可以被隐式转换为函数指针的类对象
类对象和其他数据类型之间可以进行隐式转化,这里用到的是由类对象到其他类型,而此处的其它类型就是函数指针类型。使用的
是operator关键字。另外,由其他数据类型到类对象的隐式类型是有转换构造函数或者说是多参数的构造函数并且除某一个之外其他
参数都有默认值。
#include<iostream>
using namespace std;
void fun()
{
cout << "hello" << endl;
}
class example
{
public:
using ftype = void(*)(void);
explicit example(int num = 3){};
~example(){};
operator ftype(){ return fun; };
};
int main()
{
example e1;
e1();
system("pause");
return 0;
}
显然,e1可以像函数一样被调用,此时类对象e1就是一个可调用对象。
4.类的成员指针
类的成员指针和普通指针的声明是很相似的,下面给出其结构:
返回值类型 (类名::*指针名)()=&类名::方法
#include<iostream>
using namespace std;
class example
{
public:
example(){};
~example(){};
inline void fun(){ cout << "hello" << endl; };
};
int main()
{
void(example::*f)(void) = &example::fun;
example e1;
(e1.*f)();
system("pause");
return 0;
}
输出为hello。注意,类成员函数指针不能用宏定义或者using的方法规定一个类型,而只能直接声明指针(如果可以的话还望指正,我还没有见过也不晓得书写的方法)。指针在调用的时候也必须借壳类对象才能调用。以上就是几种可调用对象。