重载函数

一、重载函数

(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的返回类型不匹配
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值