跳到主要内容

CPP之结构体与函数

· 7 分钟阅读
CheverJohn

正如标题哈,本篇博文讲的就是结构体和函数。不是新手向的教程哈,更多的这是一篇记录经验的文章。话不多说,开始咯!

我们将注意力从之前的数组转到结构上面。为结构写函数可比为数组写函数要简单得多了。虽然结构变量和数组一样,都可以存储多个数据项。但是在涉及到函数的时候,结构变量的行为更接近与基本的单值变量。这个名词可能太专业了哈。我做一下解释,还是拿数组来做比较,数组中都是一个元素为单位存储的,在结构中,相应的便是将数据组合成一个实体,实体就是数据,数据就是实体。实体(结构)==元素(数组)

这边实现传值的思想主要是利用了一个结构可以赋给另外一个结构这样子的常识知识。就像普通变量一样。我需要额外补充的是,函数将使用原始结构的副本。

函数也可以返回结构 。这边与使用数组名就是代表了数组第一个元素的地址这样的观点不同的是,结构名只是结构的名称,要获得结构的地址,必须使用地址运算符&

咱们传递结构体的基本方法就是按值传递(圈起来,要考!)但是C++作为一门精细的语言,细节到每一个内存都要深挖,不能忍受这种方法的一个缺点:如果结构非常大的话,复制结构将增加内存要求,降低系统运行的速度。出于这种原因,我们更愿意的是采取按地址传递(没错,又是“该死”的指针,所以说C++指针一定要学好!)。然后使用指针来访问结构的内容。

首先介绍“按值传递”

当结构比较小时,按值传递最舒服了用起来。接下来举的例子来源于《C++ Primer Plus(第六版)》

例子:

从a到b城需要3小时50分钟,而从b到g城需要1小时25分钟,对于这种时间,可以使用结构来表示——一个成员表示小时值,另一个成员表示分钟值,将两个时间加起来需要一些技巧,因为可能需要将分钟值转换为小时。例如前面列出的两个时间的总和为4小时75分钟,应将它转化为5小时15分钟,下面开发用于表示时间值的结构,然后再开发一个函数,它接受两个这样的结构为参数并返回表示参数的和的结构。

突出介绍一下结构函数的写法

struct travel_time{
int hours;
int mins;
};

//在已经定义好时间的结构的前提下,开始声明结构函数

travel_time sum(travel_time t1, travel_time t2);

完整代码如下:

#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};
travel_time day2 = {4, 55};

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 就像是一个标准的类型名,可以用来声明变量、函数的返回类型和函数的参数类型。

然后试travel_time结构的变量total 和t1,使用成员运算符进行数据的操作。代码很简单,可以看得懂。

然后介绍“按地址传递”

这一次我换了个题目,题目的内容我简要地说一下哈:通常我们表示一件物品的位置的时候,都是采取选择参照系利用直角坐标系或者极坐标系进行精确表示的,这边写了一个程序用于两种坐标系之间的转换。就是这样。

由于和上面的代码极其类似,所以我认为看看例子就能理解欧,就不做解析了。over

这个代码有一个小东西讲讲熬,就是while里边的cin>> 的用法,cin的特性是可以输入int整型数,但是一旦发现你输入的不是数字的时候,他就会不满足条件,变为0,然后while就会跳出循环,蛮好用的小技巧,推荐学习!

代码奉上:

#include <iostream>
#include <cmath>

struct polar{
double distance;
double angle;
};

struct rect{
double x;
double y;
};

void rect_to_polar(const rect * pxy, polar * pda);
void show_polar(const polar * pda);

int main(){
using namespace std;
rect rplace;
polar pplace;
cout << "Enter the x and y values: ";
while (cin >> rplace.x >> rplace.y){
rect_to_polar(&rplace, &pplace);
show_polar(&pplace);
cout << "Next two numbers (q to quit): ";
}
cout << "Done.\n";
return 0;
}

void rect_to_polar(const rect * pxy, polar * pda){
using namespace std;
pda->distance = sqrt(pxy->x * pxy->x + pxy->y * pxy->y);
pda->angle = atan2(pxy->y, pxy->x);
}
void show_polar(const polar * pda){
using namespace std;
const double Rad_to_deg = 57.29577951;

cout << "distance = " << pda->distance;
cout << ", angle = " << pda->angle * Rad_to_deg;
cout << " degrees\n";
}