一、重载函数
(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是底层的 :
//对于接受引用或指针的函数来说,对象是常量还是非常量对应的形参不同.
//4个独立的重载函数
Record lookup(Account&);
//函数作用于Account的引用
Record lookup(const Account&);
// 新函数, 作用于常量引用
Record lookup(Account*);
//新函数,作用于指向Account的指针
Record lookup(const Account*);
//新函数,作用于指向常量的指针
四、当我们传递一个非常量的对象或者指向非常量对象的指针时,编译器会优先选择非常量版本的函数。
我们只能把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的返回类型不匹配