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);
}


结果大概是这样:


image


PS: 由于重载,也就是由函数名并不能唯一地指定调用的函数,所以注意不要把完全“不相干”的函数起同一个名字。

重载,是“多态”的一种实现,实现了一种功能的“多样性拓展”。

posted @ 2025-07-09 15:07  吴萝卜  阅读(12)  评论(0)    收藏  举报