一、重载函数
(1)对于重载的函数来说, 它们应该在形参数量或形参类型上有所不同。
(2)类成员函数的声明为const和非const也是重载
(3)main函数不能重载
(4)只有返回类型不同不算重载
二、顶层const不影响传入函数的对象,一个拥有顶层const的形参无法和另一个没有顶层const的形参区分开来 :
Record lookup(Phone);Record lookup(const Phone);//报错//重复声明了Record lookup (Phone) Record lookup(Phone*);Record lookup(Phone* const);//报错//重复声明了Record lookup (Phone*)三、另一方面,如果形参是某种类型的指针或引用,则通过区分其指向的是常量对象还是
非常量对象可以实现函数重载,此时的const是底层的 :
四、当我们传递一个非常量的对象或者指向非常量对象的指针时,编译器会优先选择非常量版本的函数。
我们只能把const对象传给const形参,但是可以把非const对象传给const形参(非const可以转换为const)
/*如果重载函数的区别在于它们的引用类型的形参是否引用了const, 或者指针类型的形参是否指向const则当调用发生时编译器通过实参是否是常量来决定选择哪个函数 :*/Record lookup(Account&); // 函数的参数是Account的引用Record lookup(const Account&); //函数的参数是一个常量引用int main() { const Account a; Account b; lookup(a); //调用lookup (const Account&) lookup(b); //调用lookup (Account&)}五、重载函数的指针
当我们使用重载函数时,上下文必须清晰的界定到底使用哪个函数
//如果定义了指向重载函数的指针void ff(int*);void ff(unsigned int);void (*pf1) (unsigned int) = ff; // pf1指向ff (unsigned)//编译器通过指针类型决定选用哪个函数,指针类型必须与重载函数中的某一个精确匹配void (*pf2) (int) = ff;//错误:没有任何一个ff与该形参列表匹配.double (*pf3) (int*) = ff;//错误: ff和pf3的返回类型不匹配