对象数组

来源:互联网 发布:建站软件排行 编辑:程序博客网 时间: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_iXm_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】

0 0