当前位置:嗨网首页>书籍在线阅读

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