重载函数
一、重载函数
(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的返回类型不匹配
学习的时候喜欢用Markdown做记录,存货已经堆满文件夹了

浙公网安备 33010602011771号