19-传递和返回结构
7.6.1 传递和返回结构
当结构比较小时,按值传递结构最合理,下面来看两个使用这种技术的示例。第一个例子处理行程时间。有些地图指出,从Thunder Falls到Bingo城需要3小时50分钟,而从Bingo城到Gotesquo需要1小时25分钟。对于这种时间,可以使用结构来表示——一个成员表示小时值,另一个成员表示分钟值。将两个时间加起来需要一些技巧,因为可能需要将分钟值转换为小时。例如,前面列出的两个时间的总和为4小时75分钟,应将它转换为5小时15分钟。下面开发用于表示时间值的结构,然后再开发一个函数,它接受两个这样的结构为参数,并返回表示参数的和的结构。
定义结构的工作很简单:
struct travel_time
{
int hours;
int mins;
};
接下来,看一下返回两个这种结构的总和的sum()函数的原型。返回值的类型应为travel_time,两个参数也应为这种类型。因此,原型应如下所示:
travel_time sum(travel_time t1, travel_time t2);
要将两个时间相加,应首先将分钟成员相加。然后通过整数除法(除数为60)得到小时值,通过求模运算符(%)得到剩余的分钟数。程序清单7.11在sum()函数中使用了这种计算方式,并使用show_time()函数显示travel_time结构的内容。
程序清单7.11 travel.cpp
// travel.cpp -- using structures with functions
#include <iostream>
struct travel_time
{
int hours;
int mins;
};
const int Mins_per_hr = 60;
travel_time sum(travel_time t1, travel_time t2);
void show_time(travel_time t);
int main()
{
using namespace std;
travel_time day1 = {5, 45}; // 5 hrs, 45 min
travel_time day2 = {4, 55}; // 4 hrs, 55 min
travel_time trip = sum(day1, day2);
cout << "Two-day total: ";
show_time(trip);
travel_time day3= {4, 32};
cout << "Three-day total: ";
show_time(sum(trip, day3));
return 0;
}
travel_time sum(travel_time t1, travel_time t2)
{
travel_time total;
total.mins = (t1.mins + t2.mins) % Mins_per_hr;
total.hours = t1.hours + t2.hours +
(t1.mins + t2.mins) / Mins_per_hr;
return total;
}
void show_time(travel_time t)
{
using namespace std;
cout << t.hours << " hours, "
<< t.mins << " minutes\n";
}
其中,travel_time就像是一个标准的类型名,可被用来声明变量、函数的返回类型和函数的参数类型。由于total和t1变量是travel_time结构,因此可以对它们使用句点成员运算符。由于sum()函数返回travel_time结构,因此可以将其用作show_time()函数的参数。由于在默认情况下,C++函数按值传递参数,因此函数调用show_time(sum(trip, day3))将执行函数调用sum(trip, day3),以获得其返回值。然后,show_time()调用将sum()的返回值(而不是函数自身)传递给show_time()。下面是该程序的输出:
Two-day total: 10 hours, 40 minutes
Three-day total: 15 hours, 12 minutes