C++ 手把手教你實(shí)現(xiàn)可變長的數(shù)組
— 1 —
要實(shí)現(xiàn)什么函數(shù)呢?
假設(shè)我們要實(shí)現(xiàn)一個會自動擴(kuò)展的數(shù)組類,我們需要實(shí)現(xiàn)函數(shù)呢?先從下面 main 函數(shù)使用的功能,看看有什么函數(shù)是需要我們實(shí)現(xiàn)的。
輸出結(jié)果:
0 1 2 3 40 1 2 100 4
要實(shí)現(xiàn)如上的功能,要做哪些事情呢?先列出來:
要用動態(tài)分配的內(nèi)存的方式,來存放數(shù)組元素,且需要一個指針成員變量
重載賦值 = 運(yùn)算符
重載括號 [] 運(yùn)算符
重載復(fù)制構(gòu)造函數(shù)
實(shí)現(xiàn) push_back 和 length 函數(shù)
— 2 —
實(shí)現(xiàn)的步驟
— —
01 構(gòu)造函數(shù)
構(gòu)造函數(shù)的目的就是初始化一個數(shù)組,代碼如下:
// 構(gòu)造函數(shù)MyArray::MyArray(int s = 0):m_size(s){// 當(dāng)初始化長度為0的數(shù)組時,數(shù)組指針就是空的if(s == 0)m_ptr = NULL;// 當(dāng)初始化長度不為0時,則申請對應(yīng)大小的空間elsem_ptr = new int[s];}
— —
02 復(fù)制構(gòu)造函數(shù)
復(fù)制構(gòu)造函數(shù)目的就是產(chǎn)生一個與入?yún)ο笠粯拥膶ο?,但是由?MyArray 類是有指針成員變量的,所以我們必須用深拷貝的方式來實(shí)現(xiàn)復(fù)制構(gòu)造函數(shù),如果使用默認(rèn)的復(fù)制構(gòu)造函數(shù),則會導(dǎo)致兩個對象的指針成員變量指向的地址是同一個,這是非常危險(xiǎn)的。
// 復(fù)制構(gòu)造函數(shù)MyArray::MyArray(const MyArray &a){// 如果入?yún)⒌臄?shù)組對象的指針地址為空時,// 則也初始化一個空的數(shù)組if(a.m_ptr == NULL){m_ptr = NULL;m_size = 0;}// 如果入?yún)⒌臄?shù)組對象有數(shù)據(jù)時,則申請一個新的地址,// 最后來復(fù)制入?yún)ο髷?shù)組對象的數(shù)據(jù)和大小。else{m_ptr = new int[a.m_size];memcpy(m_ptr, a.m_ptr, sizeof(int)*a.m_size);m_size = a.m_size;}}
— —
03 析構(gòu)函數(shù)
析構(gòu)函數(shù)的目的就是釋放數(shù)組的資源,代碼如下:
// 析構(gòu)函數(shù)MyArray::~MyArray(){// 如果指針地址不為空時,則釋放資源if(m_ptr)delete [] m_ptr;}
— —
04 重載賦值 = 運(yùn)算符函數(shù)
重載賦值 = 運(yùn)算符函數(shù)目的就是 = 號左邊對象里存放的數(shù)組,大小和內(nèi)容都和右邊的對象一樣,代碼如下:
// 重載賦值 = 運(yùn)算符函數(shù)MyArray & MyArray::operator=(const MyArray & a){if(m_ptr == a.m_ptr) // 防止a=a這樣的賦值導(dǎo)致出錯return *this;if(a.m_ptr == NULL) // 如果a里面的數(shù)組是空的{if(m_ptr)delete [] m_ptr; // 釋放舊數(shù)組的資源m_ptr = NULL;m_size = 0;return *this;}// 如果原有空間足夠大,就不用分配新的空間if(m_size < a.m_size)用分配新的空間{if(m_ptr)delete [] m_ptr; // 釋放舊數(shù)組的資源m_ptr = new int[a.m_size]; // 申請新的內(nèi)存地址}// 拷貝內(nèi)容memcpy(m_ptr, a.m_ptr, sizeof(int)*a.m_size);m_size = a.m_size;return *this;}
— —
05 重載 [] 運(yùn)算符函數(shù)
重載 [] 運(yùn)算符函數(shù)目的就是能通過 [] 運(yùn)算符來獲取對應(yīng)下標(biāo)的數(shù)組值,代碼如下:
// 重載[]運(yùn)算符函數(shù)int & MyArray::operator[](int i){return m_ptr[i]; // 返回對應(yīng)下標(biāo)的數(shù)組值}
— —
06 加入元素到數(shù)組末尾的函數(shù)
push_back 函數(shù)的目的就是把一個新的元素,加入到數(shù)組的末尾,代碼如下:
// 在數(shù)組尾部添加一個元素void MyArray::push_back(int v){if(m_ptr) // 如果數(shù)組不為空{// 重新分配空間int *tmpPtr = new int[m_size + 1];// 拷貝原數(shù)組內(nèi)容memcpy(tmpPtr, m_ptr, sizeof(int)*m_size);delect [] m_ptr;m_ptr = tmpPtr;}else // 如果數(shù)組本來就是空的{m_ptr = new int[1];}m_ptr[m_size++] = v; //加入新的數(shù)組元素}
— —
07 獲取數(shù)組長度的函數(shù)
// 獲取數(shù)組長度的函數(shù)int MyArray:;length(){return m_size;}
— 04 —
再改進(jìn)下?
int m_cout; // 數(shù)組元素的個數(shù)int m_newNum; // 擴(kuò)容的次數(shù)
— 5 —
小結(jié)
小林coding
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!





