7.7.4 类代码文件的组织
通常将类的声明放置在头文件中。大多数情况下,在类外定义的成员函数则置于源文件中。C++程序员习惯使用一些简单的规则给头文件及其关联的类定义代码命名。类定义应置于名为type.h或type.H的文件中,type指在该文件中的类的名字。成员函数的定义则一般存储在与类同名的源文件中。
7.8 重载函数
出现在相同作用域中的两个函数,如果具有相同的名字而形参表不同,则称为重载函数(overloaded function)。
程序员可以定义一组函数,它们执行同样的一般性动作,但是应用在不同的形参类型上。调用这些函数时,无需担心调用的是哪个函数。
任何程序都都仅有一个main函数的实例。main函数不能重载。
如果两个函数声明的返回类型和形参表完全匹配,则将第二个函数声明视为第一个的重复声明。如果两个函数的形参表完全相同,但返回类型不同,则第二个声明是错误的。
函数不能仅仅基于不用的返回类型而实现重载。
7.8.1 重载与作用域
在函数中局部声明的名字将屏蔽在全局作用域内声明的同名名字。
一般的作用域规则同样适用于重载函数名。如果局部地声明一个函数,则该函数将屏蔽而不是重载在外层作用域中的同名函数。由此推论,每一个版本的重载函数都应在同一个作用域中声明。
7.8.2 函数匹配与实参转换
函数重载确定(overload resolution,即函数匹配)是将函数调用与重载函数集合中的一个函数相关联的过程。通过自动提取函数调用中实际使用的实参与重载集合中各个函数提供的形参做比较,编译器实现该调用与函数的匹配。匹配结果有三种可能:
(1) 编译器找到与实参最佳匹配(best match)的函数,并生成调用函数的代码。
(2) 找不到形参与函数调用的实参匹配的函数,在这种情况下,编译器将给出编译错误信息。
(3) 存在多个与实参匹配的函数,但没有一个是明显的最佳选择。这种情况也是错误的,该调用具有二义性。
7.8.3 重载确定的三个步骤
1. 候选函数
函数重载确定的第一步是确定该调用所考虑的重载函数集合,该集合中的函数称为候选函数(candidate function)。候选函数是与被调用函数同名的函数,并且在调用点上,它的声明可见。
2. 选择可行函数
第二步是从候选函数中选择一个或多个函数,它们能够用该调用中指定的实参来调用。因此,选出来的函数称为可行函数(viable function)。可行函数必须满足两个条件:第一,函数的形参个数与该调用的实参个数相同;第二,每一个实参的类型必须与对应形参的类型匹配,或者可被隐式转换为对应的形参类型。
3. 寻找最佳匹配(如果有的话)
函数重载确定的第二步是确定与函数调用中使用的实际参数最佳的可行函数。其原则是实参类型与形参类型越接近则匹配越佳。