32 C++ 可调用对象,仿函数 ,functional类型,

可调用对象的概念

//可调用对象:包括一般可以调用的函数, 和 仿函数


//我们之所以学习可调用对象,是为了将 可调用对象的指针 保存起来,方便我们随时调用

//可调用对象:包括一般可以调用的函数, 和 仿函数
//我们之所以学习可调用对象,是为了将 可调用对象的指针 保存起来,方便我们随时调用

//1.一般函数

void func90() {
	cout << "func90 一般函数" << endl;
}

int getfunc90(int a ) {
	cout << "getfunc90 一般函数 a = " < funcb = tt;//通过function 记录 仿函数,并调用
	funcb(999);//通过function 记录 仿函数,并调用
	cout << "========" << endl;

通过map保存

//使用map保存 函数指针对象

//一般函数
void fun91(int a ) {
	cout << "fun91 call a = " << a  << endl;
}
//一般函数
double fun92(string s) {
	cout << "fun92 call s = " << s << endl;
	return 9.8;
}
	
class Teacher92 {
	public:
		//仿函数,重载1
		void operator()(int a) {
			cout << "operator()(int a) call a = " << a << endl;
		}
		//仿函数,重载2
		double operator()(string s) {
			cout << "operator()(string s) call s = " << s << endl;
			return 111119.8;
		}
};


void main() {
	cout << "断点在这里" << endl;
	///  1.是用 C 语言的函数指针保存一般函数的指针
	typedef void(*FUNCTYPE)(int);///定义一个 函数指针类型 ,类型名字为 FUNCTYPE,返回值是void,参数是int,
	FUNCTYPE aaa = fun91;// 定义一个 函数指针类型的变量 aaa,将func91的地址传递给aaa,由于函数名字就是函数地址,因此可以直接=; 不过由于历史原因,这样写也可以:FUNCTYPE aaa = &fun91; 
	//调用 aaa(100)
	aaa(100);
	cout<<""<> map1;
	map1.insert({ 1, fanghanshu2 });
	map1.insert({ 2, funcbianliangdoublestring });
	//map1.insert({ 3, FUNCBIANLIANG });//build error , FUNCBIANLIANG 是 void(*)(int)
	//map1.insert({ 4, aaa });//build error , FUNCBIANLIANG 是 void(*)(int)

	map map2;
	map2.insert({1,aaa});
	map2.insert({ 2,FUNCBIANLIANG });
	//map2.insert({ 3,fanghanshu1 });//fanghanshu1 类型是符合的,但是是function的,map2是 void(*)(int)的,无法兼容 function

	map> map3;
	map3.insert({1,aaa});
	map3.insert({ 2,FUNCBIANLIANG });
	map3.insert({ 3,fanghanshu1 });//这样就可以,mp3是 function的,只要是参数和返回值符合的,不管是 function 或者 C	的 void(*)(int),都能符合要求

	cout << "==--0099--==" << endl;
	//调用
	map3[2](989);
}

另外的知识点:

如果函数有重载,则不能直接放在 function 里面,我们可以通过定义函数指针来解决.

//fun93有重载1
int fun93() {
	cout << "fun93 call " << endl;
	return 100;
}

//fun93有重载2
int fun93(int a) {
	cout << "fun93 call a = " < fff0 = fun92; // fun92没有重载,可以直接放在 function后
	//function fff1 = fun93; // build error :原因:fun93有重载,因此不能直接将fun93
	
	//解决方案:定义一个函数指针变量,来接受不同参数的fun93函数
	int(*fp1)(int) = fun93;
	int(*fp2)() = fun93;

	function fff2 = fp1; //这样就能存储在 map>中了
	fff2(898888);

	int ee =  fff2(120);
	cout << "ee = " << ee << endl;
}

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