前面几节你可能已经注意到,fred和area两个函数功能类似,都是计算圆的面积,但参数不同。area函数需要提供半径,而fred函数需要两点的坐标。
如果两个函数做同样的事情,给它们起相同的名字是很自然的。换句话说,fred也叫做area会更有意义。
重载是指存在多个同名函数,只要每个函数接受的参数不同,在C++中就是合法的。所以我们可以再进一步,重命名fred函数:
double area (double xc, double yc, double xp, double yp) {
return area (distance (xc, yc, xp, yp));
}
看起来这像个递归函数,其实不然,实际上这一版本的area函数在调用另一个版本的area函数。调用重载函数时,C++可以通过调用者提供的参数来来确定要调用的版本。比如:
double x = area (3.0);
C++会寻找名为area且以一个double值为参数的函数,所以这里使用的是area的第一个版本。而对于下面语句:
double x = area (1.0, 2.0, 4.0, 6.0);
C++会使用area的第二个版本。
很多内置的C++命令都是已经重载的,也就是说有不同的版本用以接受不同数目或不同类型的参数。
虽然重载是很有用的特性,但使用时一定要小心。使用不当可能让自己都迷惑了,比如你想调试重载函数的一个版本,却意外地调用了另一个版本。
实际上,这提醒了我调试的一个基本规则:一定要确认你正在看的程序版本和就是正在运行的版本!有时你可能会发现你一点点的修改程序,可是每次程序运行后输出都是一样的。这是一个警告信号,因为运行的程序版本并不是你想象的那个。为了证明无误,每次修改代码时,贴上一行输出语句(输出什么并不重要),以此确认程序的行为确实相应地改变了。