codecamp

C++ 重载

前面几节你可能已经注意到,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++命令都是已经重载的,也就是说有不同的版本用以接受不同数目或不同类型的参数。

虽然重载是很有用的特性,但使用时一定要小心。使用不当可能让自己都迷惑了,比如你想调试重载函数的一个版本,却意外地调用了另一个版本。

实际上,这提醒了我调试的一个基本规则:一定要确认你正在看的程序版本和就是正在运行的版本!有时你可能会发现你一点点的修改程序,可是每次程序运行后输出都是一样的。这是一个警告信号,因为运行的程序版本并不是你想象的那个。为了证明无误,每次修改代码时,贴上一行输出语句(输出什么并不重要),以此确认程序的行为确实相应地改变了。

C++ 将代码组合成函数
C++ 布尔值
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }