第一次寫博客,好緊張。。。
永昌ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
暑假在家學(xué)習(xí)STL,想要自己動(dòng)手實(shí)現(xiàn)一下動(dòng)態(tài)數(shù)組(實(shí)際上有很大區(qū)別,比如動(dòng)態(tài)數(shù)組的地址值是固定的、一旦創(chuàng)建容量有上限。然而我自己實(shí)現(xiàn)的是地址也跟著隨機(jī)分配的“動(dòng)態(tài)數(shù)組”。。。),話不多說上源碼:
#includeusing namespace std; class D_array { private: int *a; int n; public: D_array(); D_array(const D_array & array); ~D_array(); int at(int i);//返回動(dòng)態(tài)數(shù)組的第i位元素 bool is_full();//判斷數(shù)組是否已滿 void add(int in);//給動(dòng)態(tài)數(shù)組增加新元素 void expand();//動(dòng)態(tài)數(shù)組擴(kuò)容 int len();//返回?cái)?shù)組長(zhǎng)度 friend ostream & operator << (ostream & output,const D_array & a);//流插入運(yùn)算符重載 D_array & operator = (const D_array & darray); int * print_address();//因?yàn)閿?shù)組是動(dòng)態(tài)分配的內(nèi)存,所以需要接口返回現(xiàn)在的地址值 }; D_array::D_array() { n = 1; a = new int[n]; int i; for (i = 0; i < n; i++) { a[i] = NULL;//初始化數(shù)組元素 } } D_array::D_array(const D_array & darray) { int i, n; n = darray.n; this->a = new int[n]; this->n = darray.n; for (i = 0; i < n; i++) { this->a[i] = darray.a[i]; } } D_array::~D_array() { delete[] a;//直接刪除分配的內(nèi)存空間 } int D_array::at(int i) { if (i >= n) { cout << "wrong input!" << endl; //return 0; } else return a[i]; } bool D_array::is_full() { if (a[n - 1] == NULL) { return false; } else { return true; } } void D_array::add(int input) { int i; if (is_full()) { expand(); for (i = 0; i < n; i++) { if (a[i] == NULL) { break; } else continue; } a[i] = input; } else { for (i = 0; i < n; i++) { if (a[i] == NULL) { break; } else continue; } a[i] = input; } } void D_array::expand() { int *b, i; b = new int[n];//創(chuàng)建輔助數(shù)組 for (i = 0; i < n; i++) { b[i] = a[i];//儲(chǔ)存原數(shù)組數(shù)據(jù) } a = new int[2 * n];//容量每次擴(kuò)容2倍 for (i = 0; i < 2 * n; i++) { a[i] = NULL;//初始化 } for (i = 0; i < n ; i++)//對(duì)自己完成深復(fù)制 { a[i] = b[i]; } n = 2 * n;//更改容量 delete[] b;//銷毀輔助數(shù)組 } int D_array::len() { int i; for (i = 0; i < n; i++) { if (a[i] == NULL) { break; } else { continue; } } return i; } D_array & D_array::operator=(const D_array & darray) { int i, n; n = darray.n; delete[] this->a; this->a = new int[n]; this->n = darray.n; for (i = 0; i < n; i++) { this->a[i] = darray.a[i]; } return *this; } int * D_array::print_address() { return a;//返回地址值 } ostream & operator<<(ostream & output, const D_array & darray)//不過多贅述 { int i; for (i = 0; i < darray.n; i++) { if (darray.a[i] == NULL) { break; } else { output << darray.a[i] << " "; } } return output; } int main() { int key_in; D_array a, c; while (1) { cin >> key_in; if (key_in == -1) { break; }//一個(gè)只能輸入非0元素的動(dòng)態(tài)數(shù)組 else { a.add(key_in); } cout << a.print_address() << endl; } D_array b = a; c = a; cout << a << endl; cout << b << endl; cout << c << endl; //cout << a.len() << endl; return 0; }
過程十分簡(jiǎn)單,就是初始狀態(tài)下數(shù)組不儲(chǔ)存值(NULL)。通過add成員函數(shù)向動(dòng)態(tài)分配的內(nèi)存中寫入數(shù)據(jù)。每次再加入數(shù)據(jù)時(shí),先用is_full函數(shù)檢驗(yàn)是否滿。如果is_full返回真的話就用expand擴(kuò)容,一次寫入就結(jié)束。然后,順便練習(xí)了一下重載<<。
不過寫的時(shí)候還踩了一個(gè)很是腦殘的坑。一開始我想用復(fù)制構(gòu)造函數(shù)初始化b數(shù)組,然后就寫出了如下代碼:
D_array a,b; a = b;
實(shí)在是智障啊。。。錯(cuò)誤的原因是:創(chuàng)建b數(shù)組時(shí),通過默認(rèn)構(gòu)造函數(shù)初始化。然后再?zèng)]有釋放已分配的內(nèi)存空間情況下就直接又用復(fù)制構(gòu)造函數(shù)再一次初始化了b。所以在調(diào)用析構(gòu)函數(shù)時(shí),發(fā)生報(bào)錯(cuò)。
順便分享一篇很不錯(cuò)的文章:http://www.cnblogs.com/raichen/p/4752025.html 詳細(xì)介紹了C++復(fù)制構(gòu)造函數(shù),我是看了這篇文章才發(fā)現(xiàn)的錯(cuò)誤。