對象數組

對象數組

  前面課程我們已經學會了如何實例化一個對象,只有實例化對象後,才能通過這個對象去訪問對象的數據成員和成員函數。但是在很多場合下,一個對象是遠遠不夠用的,往往需要一組對象。比如,我們想表示一個班級的學生,並且假設這個班級有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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章