C++学习笔记(12):对象数组与对象成员

本文详细介绍了C++中对象数组的概念与实例化方式,包括栈和堆上的实例化及遍历操作,并通过示例代码进行说明。此外,还阐述了对象成员的概念,以及如何在类中使用对象成员,并提供了具体的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注:转载请标明原文出处链接: https://lvxiaowen.blog.youkuaiyun.com/article/details/107455531

1 对象数组

1.1 概念

现实中,只实例化1个对象通常不够用,需要实例化多个对象,可以通过对象数组来实现。
在这里插入图片描述
在这里插入图片描述
Coordinate coord[3]:栈的实例化方式,用".“调用;
Coordinate *p = new Coordinate[3]:堆的实例化方式,用”p[].“或”p->"调用,一定要用delete []p配套销毁。

在这里插入图片描述

1.2 示例

题目描述:
定义Coordinate类
  (1)数据成员:m_iX和m_iY
  (2)分别从堆和栈中实例化长度为3的对象数组
  (3)给数组中的元素分别赋值
  (4)遍历两个数组

Coordinate.h

#ifndef COORDINATE
#define COORDINATE

#include <iostream>
#include <string>
using namespace std;

class Coordinate
{
public:
	Coordinate();
	~Coordinate();
public:
	int m_iX;
	int m_iY;
};

#endif 

Coordinate.cpp

#include <iostream>
#include "Coordinate.h"
using namespace std;

Coordinate::Coordinate()
{
	cout << "Coordinate()" << endl;
}

Coordinate::~Coordinate()
{
	cout << "~Coordinate()" << endl;
}

main.cpp

#include <iostream>
#include"Coordinate.h"
using namespace std;

int main(void)
{
	//栈上实例化对象
	Coordinate coor[3];
	for (int k = 0; k < 3; k++)
	{
		coor[k].m_iX = k+1;
		coor[k].m_iY = k+5;
	}

	//遍历
	for (int i = 0; i < 3; i++)
	{
		cout << "(" << coor[i].m_iX<<",";
		cout <<coor[i].m_iY<< ")" <<endl;
	}

	cout <<"------------------"<< endl;

	//堆上实例化对象
	Coordinate *p = new Coordinate[3];
	p->m_iX = 10;
	p->m_iY = 20;

	p++;  //等价于p=p+1;
	p->m_iX = 40;
	p[0].m_iY = 50; //因为执行了p++; 此时p[0]等价于原始的p[1]

	p[1].m_iX = 60;
	p = p + 1;
	p->m_iY = 70;
	p = p - 2; //复原

	//遍历
	for (int j = 0; j < 3; j++)
	{
		cout << "(" << p[j].m_iX << ",";
		cout << p[j].m_iY << ")" << endl;
	}

	delete[]p;
	p = NULL;
	
	system("pause");
	return 0;
}

运行结果:
在这里插入图片描述

2 对象成员

2.1 概念

对象成员是指在C++类定义中类的成员对象。A类的对象作为B类的成员属性出现,则我们称其为B类的一个对象成员。
在这里插入图片描述
描述直线需要定义2个类:定义坐标点的类和定义坐标段的类,如下图所示。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
实例化时,先实例化A点坐标,再实例化B点坐标,最后实例化Line。销毁时顺序相反。
可以理解为先装零件,再封箱;先拆箱,再拿零件。
在这里插入图片描述

类成员为没有默认构造函数的类类型时,必须用到初始化成员列表,如下例所示。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 示例

题目描述:
定义两个类
  坐标类:Coordinate
  (1)数据成员:m_iX和m_iY
  (2)成员函数:构造函数、析构函数、数据封装函数
  线段类:Line
  (1)点A m_coorA、点B m_coorB
  (2)成员函数:构造函数、析构函数、数据封装函数、信息打印函数

Coordinate.h

//Coordinate.h

#ifndef COORDINATE
#define COORDINATE

class Coordinate
{
public:
	Coordinate(int x, int y);
	~Coordinate();
	void setX(int x);
	int getX();
	void setY(int y);
	int getY();
private:
	int m_iX;
	int m_iY;
};

Coordinate.cpp

//Coordinate.cpp
#include <iostream>
#include "Coordinate.h"
using namespace std;

Coordinate::Coordinate(int x, int y)
{
	m_iX = x;
	m_iY = y;
	cout << "Coordinate()" << endl;
}
Coordinate::~Coordinate() 
{
	cout << "~Coordinate()" << endl;
}

void Coordinate::setX(int x)
{
	m_iX = x;
}
int Coordinate::getX()
{
	return m_iX;
}
void Coordinate::setY(int y)
{
	m_iY = y;
}
int Coordinate::getY()
{
	return m_iY;
}

Line.h

//Line.h
#ifndef LINE
#define LINE

#include "Coordinate.h"
using namespace std;
class Line
{
public:
	Line(int x1, int y1, int x2, int y2);
	~Line();
	void setA(int x, int y);
	void setB(int x, int y);
	void printInfo();
private:
	Coordinate m_coorA;
	Coordinate m_coorB;
};

#endif 

Line.cpp

//Line.cpp
#include <iostream>
#include "Line.h"
using namespace std;

Line::Line(int x1, int y1, int x2, int y2) :m_coorA(x1, y1), m_coorB(x2, y2)
{
	cout << "Line()" << endl;
}
Line::~Line()
{
	cout << "~Line()" << endl;
}

void Line::setA(int x, int y)
{
	m_coorA.setX(x);
	m_coorA.setY(y);
}
void Line::setB(int x, int y)
{
	m_coorB.setX(x);
	m_coorB.setY(y);
}

void Line::printInfo()
{
	cout << "(" << m_coorA.getX() << "," << m_coorA.getY() << ")" << endl;
	cout << "(" << m_coorB.getX() << "," << m_coorB.getY() << ")" << endl;
}

main.cpp

#include <iostream>
#include <string>
#include "Line.h"
using namespace std;

int main(void)
{
	Line *p = new Line(1, 2, 3, 4);
	p->printInfo();
	delete p;
	p = NULL;
	return 0;
}

运行结果:
在这里插入图片描述

参考资料

[1] https://www.imooc.com/learn/381

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值