C++的函数:同一个函数名,指向的却是不同的代码段
沃尔特·萨维奇的书 《Problem Solving with C++ 》第四章里提到,可以为同一个“函数名”提供多个函数定义。在这些函数被叫到的时候,将根据调用时提供给它的参数的个数(或者类型),决定由哪一段函数来处理。这个概念就叫:函数重载。这样说还挺清楚的。
为了举例,可以写一个分别计算不同种类的比萨的每平方单价的函数。假设比萨有圆的和方的两种,分别有不同的尺寸和价格。用同一个函数名 unitPrice (单价)来分别求它们每平方英寸的面积下需要花多少美刀,并最终给出更实惠的选择建议。代码如下:
// 判断圆形比萨和矩形比萨 哪一种更适合购买
#include <iostream>
double unitPrice(int diameter, double price);
// diameter: 直径/英寸 (1 inch = 2.54 cm)
// price: 一个比萨的价格 (圆形的比萨)
// 返回值: 这个圆形比萨每平方英寸的价格
double unitPrice(int length, int width, double price);
// length, width: 一个矩形比萨的长度与宽度 (单位 inch)
// price: 这个矩形比萨的价格
// 返回值: 这个矩形比萨每平方英寸的价格
int main()
{
using namespace std;
int diameter, length, width;
double price_round, unit_price_round,
price_rectangular, unit_price_rectangular;
cout << "欢迎光临 Pizza 消费者联盟 \n";
cout << "请输入需购买的圆形比萨的直径(英寸): ";
cin >> diameter;
cout << "请输入这个比萨(圆形)的价格: $";
cin >> price_round;
cout << "请输入购买的矩形比萨的长与宽(单位都是英寸): ";
cin >> length >> width;
cout << "请输入这个比萨(矩形)的价格: $";
cin >> price_rectangular;
unit_price_rectangular = unitPrice(length, width, price_rectangular);
unit_price_round = unitPrice(diameter, price_round);
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(2);
cout << endl
<< "您选择的圆形比萨直径 " << diameter << " 英寸\n"
<< "它的价格是 $" << price_round << ", "
<< "每平方英寸合 $" << unit_price_round << endl
<< "您选择的矩形比萨长 " << length << " 英寸,宽 " << width << " 英寸\n"
<< "它的价格是 $" << price_rectangular << ", "
<< "每平方英寸合 $" << unit_price_rectangular << endl;
if (unit_price_round < unit_price_rectangular)
cout << "建议选择圆的!\n";
else
cout << "建议选择方的!\n";
cout << "用餐愉快,客人!\n";
return 0;
}
double unitPrice(int diameter, double price)
{
const double PI = 3.14159;
double radius, area;
radius = diameter/static_cast<double>(2); // 这样写是为了保证除法时使用的是“浮点数除法”
area = PI * radius * radius;
return (price/area);
}
double unitPrice(int length, int width, double price)
{
double area = length * width;
return (price/area);
}
结果大概是这样:

PS: 由于重载,也就是由函数名并不能唯一地指定调用的函数,所以注意不要把完全“不相干”的函数起同一个名字。
重载,是“多态”的一种实现,实现了一种功能的“多样性拓展”。

浙公网安备 33010602011771号