函数重载
- 函数重载依据参数列表,而不依据返回类型
- 重载函数匹配规则:
- 精确匹配,不需要类型转换,但可以数组名到指针、函数名到指针和T到const T
- 提升匹配,bool、short、char到int的整型提升以及无符号版本
- 内置标准类型转换
- 自定义类型转换
匹配优先级从上往下降低,即用规则1匹配到函数就调用该函数,否则用下一规则匹配
函数对象
- 具有函数行为的对象,可以实现和函数指针一样的功能
- 实质是一个重载了()运算符的类对象
1 class Addition 2 { 3 int a; 4 int b; 5 public: 6 Addition(int a, int b):a(a),b(b) 7 {} 8 int operator() () 9 { 10 return a+b; 11 } 12 }; 13 14 void test1(Addition add) 15 { 16 cout << "函数对象:" << add() << endl;; 17 } 18 19 int addition(int a, int b) 20 { 21 return a+b; 22 } 23 24 typedef int (*pAddFunc) (int, int); 25 26 void test2(int a, int b, pAddFunc addFunc) 27 { 28 cout << "函数指针:" << addFunc(a,b) << endl;; 29 } 30 31 int main() 32 { 33 Addition add(1,2); 34 test1(add); 35 36 pAddFunc addFunc = addition; 37 test2(1, 2, addition); 38 }
函数对象和函数指针
- 函数对象和函数指针在回调方面可以实现相同的功能,上面代码分别用函数指针和函数对象实现了把两数相加的函数的回调
- 但是,函数对象是数据和方法的集合。细心观察上面的代码可以知道用函数对象实现回调时,对于用户来说使用更方便,数据
都封装在对象里,不用额外的传参(test1);用函数指针时则需要额外的参数(test2)。
- 函数指针的优势是定义方便,不用定义一整个类,而且开销小。