对象数组

对象数组

  前面课程我们已经学会了如何实例化一个对象,只有实例化对象后,才能通过这个对象去访问对象的数据成员和成员函数。但是在很多场合下,一个对象是远远不够用的,往往需要一组对象。比如,我们想表示一个班级的学生,并且假设这个班级有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;
}



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值