结构数组与对象数组

     在C语言中,把具有相同结构类型的结构变量,有序地集合起来便组成了结构数组.在C++中,与此类似将具有相同class类型的对象有序地集合在一起便组成了对象数组,对于一维对象数组也称为"对象向量",因此对象数组的每个元素都是同种class类型的对象.

一、结构数组

一个结构变量可将具有一定逻辑意义的多个不同类型的数据组合在一起。例如,本章前面使用的emp结构,将字符指针(或字符数组)、字符、整型等不同数据类型组合在一起。这样,每一个用结构emp定义的变量都可表示一个员工的信息。

如果需要处理多个员工的信息,则可以用结构emp定义多个结构变量。更好的方法便是定义结构数组,数组的每个元素就是一个结构变量。在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体。如一个公司的员工资料、员工工资表等。

1 结构数组的定义和引用

结构数组的定义方法与基本数据类型的数组定义方法类似,只是结构数组中的每一个元素的数据类型是一个结构。因此,要定义一个结构数组,首先要定义一个结构类型,然后再把数组元素说明为这种结构类型。

例如,在用计算机管理的低保数据中,找出年龄最大的低保人员,并输出其所有信息。

在管理低保户信息时,需要了解低保户的许多信息,如姓名、性别、年龄、享受低保金额等,可使用结构,来表示这些类型不同的数据。当要管理多个低保户的信息时,可通过结构数组,让数组的每一个元素保存一个低保户信息。

首先,使用以下代码定义结构:

struct minneed
{
char *name;
char sex;
unsigned short age;
float amount;
};
接着,使用以下代码定义结构数组:
struct minneed needs[2];
编译器将自动为所有结构数组元素分配足够的存储单元,结构数组的元素是连续存放的,如图13-6所示。
 
(点击查看大图)图13-6  结构数组的存储

由于每个结构数组元素的类型是结构,其使用方法和相同类型的结构变量一样,既可以引用数组的元素,如needs[0];也可以引用结构数组元素的分量,如needs[0].name。像所有数组一样,结构数组元素的下标也从0开始。结构数组分量的引用是通过使用数组下标和结构分量操作符"."来完成的,其一般格式为:

结构数组名[下标].分量名

例如:

needs[0].name、needs[0].age分别表示结构数组元素needs[0]的成员name和age。

结构数组中各元素可直接赋值,例如,以下代码将第2个结构数组元素赋值给第1个结构数组元素。

needs[0]=needs[1];
相当于以下多条语句:
needs[0].name=needs[1].name;
needs[0].sex=needs[1].sex;
needs[0].age=needs[1].age;
needs[0].amount=needs[1].amount;


2  结构数组的初始化

一个结构变量可以包含多个成员,而结构数组又是由多个结构变量组成的。因此,一个结构数组中包含非常多的数据。如果每次都要由用户在程序运行时,输入这些数据,工作量将非常大。为调试程序,一般可在程序代码中对结构数组进行初始化。而实际运行程序时,可通过文件保存数据,在需要时,从文件中读取数据保存到结构数组中。有关文件的相关操作,参见本书第16章中的相关内容。

对结构数组的初始化,与对单个结构的初始化类似,只是需将多个结构元素中各成员的值分别给出就行。例如,下面首先定义一个结构minneed,再使用该结构定义一个结构数组needs[4],并将该结构数组进行初始化。

struct minneed
{
char *name;
char sex;
unsigned short age;
float amount;
};
struct minneed needs[4]=
{{"zhangjun",1,55,150.0},
{"wumei",0,48,130.0},
{"duli",0,55,180.0},
{"liping",1,56,150.0}
};
在初始化过程中,要注意初始化值与各个结构成员的数据类型的匹配。

3  结构数组实例

下面用实例演示结构数组的使用方法。要求对低保户数据进行比较,找出年龄最大的低保户,并输出其相应资料。

【程序13-4】结构数组示例

1: #include<stdio.h>
2: #define N 4
3: 
4: struct minneed
5: {
6:     char *name;
7:     char sex;
8:     unsigned short age;
9:     float amount;
10: };
11: 
12: int main()
13: {
14:     struct minneed needs[N]=
15:     {{"zhangjun",1,55,150.0},
16:      {"wumei",0,48,130.0},
17:      {"duli",0,55,180.0},
18:      {"liping",1,56,150.0}
19:     };
20:     int i,m=1;
21: 
22:     for(i=1;i<N;i++)
23:         if(needs[m].age<needs[i].age)
24:             m=i;
25: 
26:     printf("年龄最大的低保户的资料:\n");
27:     printf("姓名:%s\n",needs[m].name);
28:     printf("性别:%s\n",(needs[m].sex==1)?"男":"女");
29:     printf("年龄:%d\n",needs[m].age);
30:     printf("低保金额:%.2f\n",needs[m].amount);
31:     getch();
32:     return 0;
33: }

第2行定义一个符号常量,表示处理的低保户数量。

第4~10行定义低保户信息的结构类型。

第14~19行使用struct minneed结构类型,定义含有4个元素的结构数组,并初始化每个结构数组元素的值。

第20行定义程序中使用到的局部变量,其中,变量m用来记录年龄最大的低保户在数组中的序号。本例中因不需要对数组进行排序,所以只需要记住最大值所处的位置即可。在此处,先假设结构数组中第1个元素的年龄为最大,所以让m=1。

第22~24行从第2个数组元素开始逐个比较needs[i].age的值,找到比needs[m].age更大的值时,使变量m保存i的值。

第26~30行用来输出结构数组中序号为m的元素中所有成员的值。

二、对象数组

1 创建一个c++对象数组
内置类型数组可以这样创建: int array[10];  

刚刚测了一下,如果这个array是全局变量,那么array的全部元素被初始化为0;

如果array是类的普通的成员变量或者函数内的局部变量,array的所有元素会随即初始化某个值;

如果array是类的静态变量,则需要程序员手动初始化,否则当调用array时,会提示链接错误。

如果你要创建某个“类”的数组,一般是这样: Apply applyArray[10];
如果仅仅是这样写的,那么Apply需要一个默认构造函数(就是没有参数的构造函数)。

如果你要这样创建数组:Apply applyArray[2] = {apple1, apple2};
那么Apply需要一个“可用的”拷贝构造函数。

如果你要这样创建数组:Apply arrayApply[10000] = {apple1, apple2};
那么Apply类即需要 默认构造函数 , 也需要 拷贝构造函数 。 
如下:
#include<iostream>
using namespace std;

class point
{
public:
void setpoint(int x,int y);
private:
int x;
int y;
};
void point::setpoint(int x,int y)
{
this->x=x;
this->y =y;
}
int main()
{
point a[10]; //定义一个数组对象,调用带参构造函数
int x,y;
cin>>x>>y;
a[0].setpoint(x,y); //第一个对象调用方法setpoint,修改该点的坐标
return 0;
}


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值