对象数组

对象数组

  前面课程我们已经学会了如何实例化一个对象,只有实例化对象后,才能通过这个对象去访问对象的数据成员和成员函数。但是在很多场合下,一个对象是远远不够用的,往往需要一组对象。比如,我们想表示一个班级的学生,并且假设这个班级有50个学生。果我们还是像以前一样,简单的使用对象的实例化的话,就需要定义50个变量来表示这50个学生,显然这样做是很麻烦很愚蠢的。这时,我们就需要通过一个数组来表达这一个班的学生。还有,如果我们去定义一个坐标,那么这一个坐标只能代表一个点,但是,如果我们想去定义一个矩形的话,就需要定义4个点,然后这4个点的连线形成一个矩形,那么这4个点也可以定义成一个数组。说到这里,想必大家应该知道,今天的重点就是对象数组。

  接下来我们看下面这个例子。

      

  在这里我们定义了一个坐标类(Coordinate),并且定义了其两个数据成员(一个表示横坐标,一个表示纵坐标)。我们在使用的过程中,首先是在栈中实例化了一个对象数组,每个数组元素就是一个坐标的对象,并且均可以访问对象的数据成员(如上,我们给对象数组的第2个元素的横坐标赋值为10);其次我们又在堆上实例化了一个对象数组,同样,每个数组元素均可以访问对象的数据成员(如上,我们给对象数组的第1个元素的纵坐标赋值为20)。记住,在堆上实例化对象数组后,使用完毕,需要将申请的内存释放掉(用delete []p),最后还要赋值为空(NULL)。

  接下来看看在内存中是如何存储的(如下)。

代码示例:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include "classaarry.h"
using namespace std;

int main()
{
    cout<<"###########栈实例化############"<<endl;
    //栈实例化:系统申请系统回收,程序生命结束回收资源
    ClassAarry arry[3];

    for(int i = 0;i < 3;i ++){
        arry[i].m_x = i;
        arry[i].m_y = i + 1;
        cout<<"cout = "<<i<<" m_x "<<arry[i].m_x<<" m_y "<<arry[i].m_y<<endl;
    }
    
    
    cout<<"###########堆实例化##############"<<endl;
    //堆实例化:自给自足,自己开辟自己释放
    ClassAarry * ar = new ClassAarry[3];
#if 1
    for(int i = 0;i < 3;i ++){

        ar->m_x = i;
        ar->m_y = i + 1;
        cout<<"num = "<<i<<" m_x "<<ar->m_x<<" m_y "<<ar->m_y<<endl;
        ar ++;//通过移动指针的方式,给数组对象的成员参数赋值
    }
    //经过了三次循环后,p指向了一个非法内存,不能直接就delete,而应该让p再指向我们申请的数组对象首地址,如下
    ar --;
    ar --;
    ar --;
#else
    for(int i = 0;i < 3;i ++){
        ar[i].m_x = i;//直接通过对象数组下标赋值,对象指针地址不变。
        ar[i].m_y = i + 1;
        cout<<"num = "<<i<<" m_x "<<ar[i].m_x<<" m_y "<<ar[i].m_y<<endl;
    }
#endif
    delete []ar;


    return 0;
}



猜你喜欢

转载自blog.csdn.net/yuanchunsi/article/details/78884109
今日推荐