**数组元素不仅可以是基本数据类型,也可以是自定义类型。**例如,要存储和处理某单位全体雇员的信息,就可以建立一个雇员类的对象数组。对象数组的元素是对象,不仅具有数据成员,而且还有函数成员。 因此,和基本类型数组相比,对象数组有一些特殊之处。
(1)声明一个一维对象数组的语句形式为:
类名 数组名[常量表达式];
(2)与基本类型数组一样,在使用对象数组时也只能引用单个数组元素。每个数组元素都是一个对象,通过这个对象,便可以访问到它的公有成员,一般形式是:
数组名[下标表达式].成员名
(3)**对象数组的初始化过程,实际上就是调用构造函数对每一个元素对象进行初始化的过程。**如果在声明数组时给每一个数组元素指定初值,在数组初始化过程中就会调用与形参类型相匹配的构造函数,例如:
A a[2]={A(1,2),A(3,4)};
在执行时会先后两次调用带形参的构造函数分别初始化a[0]和a[1]。如果没有指定数组元素的初始值,就会调用默认的构造函数,例如:
A a[2]={A(1,2)};
在执行时首先调用带形参的构造函数初始化a[0],然后调用默认构造函数初始化a[1]。
【注意】
如果需要建立某个类的对象数组,在设计类的构造函数时,就要充分考虑到数组元素初始化的需要:当各元素对象的初值要求为相同的值时,应该在类中定义默认构造函数;当各个元素对象的初值要求为不同的值时,需要定义带形参(无默认值)的构造函数。
当一个数组中的元素对象被删除时,系统会自动调用析构函数来完成扫尾工作。
【例1】对象数组应用举例
Point.h
文件:
#pragma once
#ifndef _POINT_H
#define _POINT_H
class Point
{
public:
Point();
Point(int x, int y);
~Point();
void move(int newX, int newY);
int getX() { return x; }
int getY() { return y; }
static void ShowCount();
private:
int x, y;
};
#endif // !_POINT_H
Point.cpp
文件:
#include<iostream>
#include"Point.h"
using namespace std;
Point::Point()
{
x = y = 0;
cout << "调用默认构造函数" << endl;
}
Point::Point(int x, int y):x(x),y(y)
{
cout << "调用构造函数" << endl;
}
Point::~Point()
{
cout << "调用析构函数" << endl;
}
void Point::move(int newX, int newY)
{
cout << "把点移动到:("<<newX<<","<<newY<<")" << endl;
x = newX;
y = newY;
}
Main.cpp
文件:
#include<iostream>
#include"Point.h"
using namespace std;
int main()
{
cout << "进入主函数" << endl;
Point a[2];
for (int i = 0; i < 2; i++)
{
a[i].move(i + 10, i + 20);
}
cout << "退出主函数" << endl;
return 0;
}
运行结果: