对象数组

---------------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");

return 0;

}

   

   

   

   

   

   

   

   

   

   

【made by siwuxie095】

原文地址:https://www.cnblogs.com/siwuxie095/p/6792808.html