1.c++五大可调用的对象
可调用的对象常常作为泛型算法的实参
1)函数
2)函数指针
- 函数名其实也是函数指针,只不过函数名是一个常量指针,它的值不能改变,只能指向该函数,不能改变它的值让它指向别的函数
void fun1(int a) { cout << a << endl; } void fun2(int a) { cout << a+10 << endl; } int main() { void(*f)(int); //f是一个函数指针 f = fun1; //将f指向函数fun1() f(6); //输出6 f = fun2; //将f指向函数fun2() f(6); //输出:16 (*fun1)(6); //fun1其实也是函数指针,并且是一个常量指针,它只能指向函数fun1(),不能让它指向别的函数 fun1 = fun2; //编译错误:不可以修改常量指针的指向(值) return 0; }
4)bind对象
5)重载了opeartor()运算符的类
2.可调用的对象的调用形式
int(int, int) //此调用形式表示:接受两个int,返回一个int
3.function类型(c++11)
1)function类型可以将调用形式相同的可调用对象统一成一种类型
2)把可调用对象定义成function类型后,可以直接使用function类型来“简化”调用
3)不能直接将重载的函数名存入function类型的对象中
int add(int a, int b) { return a + b; } int add(int a, int b, string s) { return a; } int main() { function<int(int, int)> f1 = add; //编译错误,编译器不知道是哪个add int(*fun)(int, int) = add; function<int(int, int)> f2 = fun; //正确:函数指针fun指向带有两个参数的add()函数 cout << f2(1, 2) << endl; //输出3 function<int(int, int)> f3 = [](int a, int b) {return add(a, b); }; //正确:使用lambda表达式来指定带有两个参数的add()函数 cout << f3(3, 4) << endl; //输出7 return 0; }
解决:
- 使用函数指针来指向某个重载函数
- 使用lambda表达式来指向某个重载函数