一、对象数组的定义
        
所谓对象数组,指每一个数组元素都是对象的数组,即若一个类有若干个对象,我们把这一系列的对象用一个数组来存放。对象数组的元素是对象,不仅具有数据成员,而且还有函数成员。

        声明一个一维数组的格式如下:
        类名 数组名[常量表达式]

        与基本数据类型的数组一样,在使用对象数组时也只能访问单个数组元素,其一般形式为:
        数组名[下标表达式].成员名

        在建立数组时,需要对数组进行初始化。对象数组的初始化过程实际上就是调用构造函数对每一个元素对象进行初始化的过程。

        当一个数组中的元素被删除时,系统也会调用析构函数。

二、对象数组的初始化

(一)构造函数没有参数(各元素对象的初值要求为相同的值时,应该在类中定义不带参数的构造函数或者是默认构造函数)

#include<iostream>
using namespace std;
class exam {
public:
	exam() {
		x = 2022;
	}
	int getX() {
		return x;
	}
	~exam() {};
private:
	int x;
};
int main()
{
	exam a[5];
	for (int i = 0; i < 5; i++)
	{
		cout << a[i].getX() << " ";
	}
	cout << endl;
	return 0;
}

 运行结果:

 (二)构造函数有1个参数 

#include<iostream>
using namespace std;
class exam {
public:
	exam(int n) {
		x = n;
	}
	int getX() {
		return x;
	}
	~exam() {};
private:
	int x;
};
int main()
{
	exam a[5] = { 0,1,2,3,4 };
	for (int i = 0; i < 5; i++)
	{
		cout << a[i].getX() << " ";
	}
	cout << endl;
	return 0;
}

 例2:用不带参数和带参数的构造函数给对象数组赋值

#include<iostream>
using namespace std;
class exam {
public:
	exam() {
		x = 2022;
	}
	exam(int a) {
		x = a;
	}
	int getX() {
		return x;
	}
	~exam() {};
private:
	int x;
};
int main()
{
	exam a[5]={0,1,2,3,4};
	exam b[5] = { 0,1};
	exam c[5];
	for (int i = 0; i < 5; i++)
	{
		cout << a[i].getX() << " ";
	}
	for (int i = 0; i < 5; i++)
	{
		cout << b[i].getX() << " ";
	}
	for (int i = 0; i < 5; i++)
	{
		cout << c[i].getX() << " ";
	}
	cout << endl;
	return 0;
}

(三)构造函数有多个参数(各元素对象的初值要求为不同的值时,需要定义带形参的构造函数)

只需在定义对象数组时,在花括号中分别写出构造函数并指定实参即可实现初始化

例3:对坐标进行操作

//Point.h
#pragma once
class Point {
public:
	Point();
	Point(int x, int y);
	void move(int newX, int newY);
	int getX() const;//为什么加const?加const表示什么?
	int getY() const;
	~Point();
private:
	int x;
	int y;
};
//Point.cpp
#include <iostream>
#include "Point.h"
using namespace std;
Point::Point() {
	x = 0;
	y = 0;
	cout << "Default Constructor called." << endl;
}
Point::Point(int xx, int yy)
{
	x = xx;
	y = yy;
	cout << "Constuctor called." << endl;
}
/*
Point::Point(int xx,int yy): x(xx),y(yy) {
	cout << "Constructor called."<< endl;
}和上面的构造函数等效,写法更简洁;
*/
Point::~Point() {
	cout << "Default Constructor called." << endl;
}
void Point::move(int newX, int newY) {
	cout << "Moving the point to(" << newX << "," << newY << ")" << endl;
}
int Point::getX() const
{
	return x;
}
int Point::getY()const
{
	return y;
}
//6_3.cpp
#include<iostream>
#include"Point.h"
using namespace std;
int main()
{
	cout << "Entering main..." << endl;
	Point a[2];//声明对象数组;
	for (int i = 0; i < 2; i++)
		a[i].move(i + 10, i + 20);
	cout << "Exiting main..." << endl;
	return 0;
}

 

运行结果

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐