---------------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"); return 0; } |
【made by siwuxie095】