对象数组
例子如下:
/*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。
这个其实很好理解,比如生产一辆汽车,肯定是先生产汽车的各个零件,然后再按照图纸将各个零件组装起来,而拆掉一辆汽车时,肯定是先拆掉各个零件,然后再将各个零件分解。