c++远征之封装篇(对象)

本文通过实例详细解析了C++中对象数组的使用方式及其生命周期管理,并深入探讨了对象成员的概念及构造与析构过程。

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

对象数组
例子如下:
/*Coordinate.h*/
class Coordinate
{
public:
	Coordinate();
	~Coordinate();

public:
	int m_iX;
	int m_iY;

};
/*Coordinate.cpp*/
#include"Coordinate.h"
#include<iostream>
using namespace std;
Coordinate::Coordinate()
{
	cout << "Coordinate" << endl;
}

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

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

int main(void)
{
	Coordinate coor[3];
	coor[0].m_iX = 3;
	coor[0].m_iY = 5;
        //从堆中申请内存,需要手动释放
	Coordinate *p = new Coordinate[3];
	p->m_iX = 7;
	p[0].m_iY = 9;

	p++;
	p->m_iX = 11;
	p[0].m_iY = 13;

	p[1].m_iX = 15;
	p++;
	p->m_iY = 17;

	for (int  i = 0; i < 3; i++)
	{
		cout << "coor_x:" << coor[i].m_iX << endl;
		cout << "coor_y:" << coor[i].m_iY << endl;
	}

	/*因为此时p是指向数组的最后一个元素的*/
	for (int j = 0; j < 3; j++)
	{
		cout << "p_x:" << p->m_iX << endl;
		cout << "p_y:" << p->m_iY << endl;
		p--;
	}

	p++;          /*让p指向数组的第一个地址*/
	delete[]p;
	p = NULL;
	system("pause");
	return 0;
}
运行结果:


结果分析:创建了六个对象,每创建一个对象调用一次构造函数,所以刚开始输出6个Coordinate,输出coor数组中的值,coor[0]有值,其他两个没有值,然后是输出p数组中的值。释放了三个内存,每释放一个内存调用一次析构函数,所以输出最后三个~Coordinate。


二:对象成员
例子如下:画一条线段(端点坐标为A和B)
/************************************************************/
要求:
        定义两个类:
                   坐标类:Coordinate
                   数据成员:横坐标m_iX,纵坐标m_iY
                   成员函数:构造函数、析构函数、数据封装函数
                   线段类:Line
                   数据成员:点A m_coorA,点B m_coorB
                   成员函数:构造函数、析构函数、数据封装函数、信息打印函数
/************************************************************/
代码实现:
/*Coordinate.h*/
class Coordinate
{
public:
	Coordinate(int x,int y);
	~Coordinate();
	void setX(int x);
	int getX();
	void setY(int y);
	int getY();

public:
	int m_iX;
	int m_iY;

};

/*Coordinate.cpp*/
#include"Coordinate.h"
#include<iostream>
using namespace std;
Coordinate::Coordinate(int x,int y)
{
	m_iX= x;
	m_iY= y;
	cout << "Coordinate() " << m_iX<<","<<m_iY<<endl;
}

Coordinate::~Coordinate()
{
	cout << "~Coordinate() "<< m_iX<< ","<<m_iY<<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;
}

#include"Coordinate.h"

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 printlnfo();

private:
	Coordinate m_coorA;
	Coordinate m_coorB;
};

/*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::printlnfo()
{
	/*打印A点坐标*/
	cout << "(" << m_coorA.getX()<< "," << m_coorA.getY()<< ")" << endl;
	/*打印B点坐标*/
	cout << "(" << m_coorB.getX()<< "," << m_coorB.getY()<< ")" << endl;
}

/*demo.cpp*/
#include <iostream>
#include <stdlib.h>
#include"line.h"
using namespace std;

int main(void)
{
	Line *p = new Line(1,2,3,4);
	delete p;
	p = NULL;
	system("pause");
	return 0;
}

运行结果:


结果分析:重点是类创建的顺序和销毁的顺序
首先创建的是类Coordinate,创建Coordinate类时首先创建的是点A,所以调用构造函数时输出的是A点的坐标(1,2),然后创建点B时,调用构造函数输出B点的坐标(3,4),然后创建类Line。
销毁类的顺序正好与创建时的顺序相反:首先销毁的是类Line,然后再销毁类Coordinate中的对象B,最后才销毁对象A,因为是先创建对象A,然后才创建对象B。

这个其实很好理解,比如生产一辆汽车,肯定是先生产汽车的各个零件,然后再按照图纸将各个零件组装起来,而拆掉一辆汽车时,肯定是先拆掉各个零件,然后再将各个零件分解。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值