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