对象数组
来源:互联网 发布:建站软件排行 编辑:程序博客网 时间:2024/06/09 19:22
---------------siwuxie095
对象数组
对于程序来说,实例化对象非常重要,只有先实例化对象,才能通过
这个对象访问相关的数据成员和成员函数
但是在很多场合下,一个对象是远远不够用的,往往需要一组对象
「某些情况下需要一组对象」
如:想表示一个班的学生,假如这个班的学生一共有 50人,如果还
使用简单的对象实例化,就要定义 50个变量来表示这 50 个学生
显然,这样做是很愚蠢的,需要通过数组来表达这一个班的学生
再如:如果需要定义一个坐标,一个坐标只能代表一个点,如果要定义
一个矩形,就可以定义四个点,四个点的连线形成一个矩形,这四个点
也可以定义成一个数组
定义一个坐标类:
在使用时:
(1)可以从栈上实例化一个对象数组,如:Coordinate coord[3];
(2)可以从堆上实例化一个对象数组,如:Coordinate *p=new Coordinate[3];
即共调用 6 次构造函数,6 次析构函数
在内存中的工作方式:
当从栈区实例化一个数组时,即:Coordinate coord[3];,会从栈区
分配相应的内存,这些内存在使用完成后会被系统自动回收,分配的
内存分别表示为coord[0]、coord[1]、coord[2],而每一个元素中又
有两个数据成员m_iX 和m_iY
当从堆中实例化一个数组时,即:Coordinate *p=new Coordinate[3];,
也会从堆区分配相应的内存,可以使用p 表示指向的第一个数组元素,或
使用p[0] 来表示第一个数组元素,后面的元素表示以此类推 … 最后,需要
手动回收这些内存
程序:
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;
}
main.cpp:
#include <stdlib.h>
#include"Coordinate.h"
#include <iostream>
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=p+1;或 p+=1;
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;
}
//注意此时指针因为有++操作所以是逆序遍历
for (int i =0; i < 3;i++)
{
cout <<"p_x:" << p->m_iX << endl;
cout <<"p_y:" << p->m_iY << endl;
p--;
}
//在for循环之后p指针的位置已经不是最开始new出的位置,而是前一个位置
//如果不做++,delete掉的就不是同一段内存,导致出错
p++;
//如果不加中括号那么就只会销毁第一个从堆中实例化的对象
//只调用一次析构函数,内存泄露且调试出错
delete []p;
p = NULL;
system("pause");
return0;
}
【made by siwuxie095】