您的位置:首页 > 编程语言 > C语言/C++

C++primer学习笔记-----6.4函数重载

2017-05-10 08:13 225 查看
如果同一作用域内的几个函数名字相同但形参列表不同,我们称之为重载函数

函数重载通常用于逻辑功能相同,但处理对象类型不同的函数,以此减轻程序员记名字的压力。】

重载和const 形参

顶层const 不影响传入函数的对象(也可以从左值当右值用考虑)。一个拥有顶层const 的形参无法和另一个没有顶层const 的形参区分开来

另一方面,如果形参的const 是底层的,则通过区分其关联的对象是常量还是非常量可以实现函数重载。我们只能把底层const 对象传递给底层const 形参,而非常量可以用于初始化const 对象,所以是否是底层const 的对象都能接受非常量实参,不过如6.6.1 节将介绍的,当传递一个关联非常量的对象时,编译器会优先选用非常量版本的函数。】

const_cast 和重载

const_cast 在重载函数的情境中尤其有用,它可以显式地转换传入参数的类型,进而可以将整个过程封装成针对不同类型的同名函数。(返回值类型也可以通过它改变)const string &shorterString(const string &s1, const string &s2)
{
return (s1.size() <= s2.size()) ? s1 : s2;
}

string &shorterString(string &s1, string &s2) // 上一个函数的重载版本,利用const_cast 实现返回非常量的引用
{
auto &r = shorterString(const_cast<const string &>(s1), const_cast<const string &>(s2));
return const_cast<string &>(r);
}】

调用重载的函数

函数匹配实质我们把函数调用与一组重载函数中的某一个关联起来的过程,又叫函数确定。

在大多情况下,确定调用一组重载函数中的哪个函数比较容易;但是在另外一些情况下,比如参数数量相同且类型可以相互转换,确定调用哪个函数就比较困难了,我们将在6.6 节介绍这种情况下编译器的处理方法。】

当调用一组重载函数时有可能出现三种结果:

编译器找到一个与实参最佳匹配的函数,并生成调用该函数的代码;

找不到任何一个函数与调用的实参匹配,此时编译器发出无匹配的错误信息;

有多于一个函数可以匹配,但是每一个都不是明显的最佳选择,此时将发生错误,称为二义性调用

重载与作用域

重载对作用域的一般性质并没有什么改变:如果我们在内层作用域中声明名字,它将隐藏外层作用域中的同名实体,在不同的作用域中无法成功地重载函数

在C++ 语言中,名字查找是发生在类型检查之前的。】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++