C++函数重载

   同一个作用域内的几个函数名字相同但形参列表不同,我们称之为函数重载。对于重载函数来说,它们应该在形参数量或形参类型上有所不同。不允许两个函数除了返回类型外,其他所有的要素都相同。

判断两个形参的类型是否相同

Record lookup(const Accout &acct);
Record lookup(const Accout &); //错误,形参的名字仅仅起到记忆的作用,它并不影响形参列表的内容,所以两个函数是相同的

typedef Phone Telno;
Record lookup(const Phone &);
Record lookup(const Telno &); //错误,Telno是Phone的别名,两个函数形参列表相同

重载和const形参
   顶层const不影响传入函数的对象,一个拥有顶层const的形参无法和另外一个没有顶层const的形参区分开来:

Record lookup(Phone);
Record lookup(const Phone); //参数传递时会忽略顶层const属性,所以两个函数相等

Record lookup(Phone *);
Record lookup(const Phone *); //参数传递时会忽略顶层const属性,所以两个函数相等

   如果形参是某种类型的指针或引用,则通过区分其指向的是常量对象还是非常量对象可以实现函数重载,此时的const是底层的:

Record lookup(Phone &);
Record lookup(const Phone &);//新函数,作用于常量引用

Record lookup(Phone *);
Record lookup(const Phone *);//新函数,作用于指向常量的指针

   因为const不能转换为其他类型,所以只能把const对象(或指向const的指针)传递给const形参。相反的,因为非常量可以转换成const,所以上面四个函数都可以作用于非常量对象或指向非常量的指针。

const_case和重载

const string &shorterString(const string &s1, const string &s2){
	return s1.size() <= s2.size()? s1 : s2;
}

   我们可以对两个非常量的string实参调用该函数,得到的返回结果仍然是const string的引用。因此我们需要一种新的shorterString函数,当它的实参不是常量时,得到的结果是一个普通的引用,使用const_cast可以做到这一点:

string &shorterString(const string &s1, const string &s2){
	auto &r = shorterString(const_cast<const string &>(s1), 
							const_cast<const string &>(s2));
	return const_cast<string &>(r);
}

   在这个版本的函数中,首先将它的实参强制转换成对const的引用,然后调用了shorterString的const版本。const版本返回对const string的引用,这个引用实际上绑定在某个初始化的非常量实参上。因此,我们可以再将其转回一个普通的string &。

调用重载函数
   函数匹配是指一个过程,在这个过程中我们把函数调用与一组重载函数中的某一个关联 起来,函数匹配也叫重载确定。

当调用重载函数时,有三种可能的结果:
编译器找到一个与实参最佳匹配的函数,并生成调用该函数的代码。
找不到任何一个函数与调用的实参匹配,此时编译器发出无匹配的错误。
有多于一个函数可以匹配,但是每一个都不是明显的最佳选择。此时也将发生错误,称为二义性调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值