第一次写博客,好紧张。。。

暑假在家学习STL,想要自己动手实现一下动态数组(实际上有很大区别,比如动态数组的地址值是固定的、一旦创建容量有上限。然而我自己实现的是地址也跟着随机分配的“动态数组”。。。),话不多说上源码:

#include<iostream>usingnamespacestd;classD_array{private:int*a;intn;public:D_array();D_array(constD_array&array);~D_array();intat(inti);//返回动态数组的第i位元素boolis_full();//判断数组是否已满voidadd(intin);//给动态数组增加新元素voidexpand();//动态数组扩容intlen();//返回数组长度friendostream&operator<<(ostream&output,constD_array&a);//流插入运算符重载D_array&operator=(constD_array&darray);int*print_address();//因为数组是动态分配的内存,所以需要接口返回现在的地址值};D_array::D_array(){n=1;a=newint[n];inti;for(i=0;i<n;i++){a[i]=NULL;//初始化数组元素}}D_array::D_array(constD_array&darray){inti,n;n=darray.n;this->a=newint[n];this->n=darray.n;for(i=0;i<n;i++){this->a[i]=darray.a[i];}}D_array::~D_array(){delete[]a;//直接删除分配的内存空间}intD_array::at(inti){if(i>=n){cout<<"wronginput!"<<endl;//return0;}elsereturna[i];}boolD_array::is_full(){if(a[n-1]==NULL){returnfalse;}else{returntrue;}}voidD_array::add(intinput){inti;if(is_full()){expand();for(i=0;i<n;i++){if(a[i]==NULL){break;}elsecontinue;}a[i]=input;}else{for(i=0;i<n;i++){if(a[i]==NULL){break;}elsecontinue;}a[i]=input;}}voidD_array::expand(){int*b,i;b=newint[n];//创建辅助数组for(i=0;i<n;i++){b[i]=a[i];//储存原数组数据}a=newint[2*n];//容量每次扩容2倍for(i=0;i<2*n;i++){a[i]=NULL;//初始化}for(i=0;i<n;i++)//对自己完成深复制{a[i]=b[i];}n=2*n;//更改容量delete[]b;//销毁辅助数组}intD_array::len(){inti;for(i=0;i<n;i++){if(a[i]==NULL){break;}else{continue;}}returni;}D_array&D_array::operator=(constD_array&darray){inti,n;n=darray.n;delete[]this->a;this->a=newint[n];this->n=darray.n;for(i=0;i<n;i++){this->a[i]=darray.a[i];}return*this;}int*D_array::print_address(){returna;//返回地址值}ostream&operator<<(ostream&output,constD_array&darray)//不过多赘述{inti;for(i=0;i<darray.n;i++){if(darray.a[i]==NULL){break;}else{output<<darray.a[i]<<"";}}returnoutput;}intmain(){intkey_in;D_arraya,c;while(1){cin>>key_in;if(key_in==-1){break;}//一个只能输入非0元素的动态数组else{a.add(key_in);}cout<<a.print_address()<<endl;}D_arrayb=a;c=a;cout<<a<<endl;cout<<b<<endl;cout<<c<<endl;//cout<<a.len()<<endl;return0;}

过程十分简单,就是初始状态下数组不储存值(NULL)。通过add成员函数向动态分配的内存中写入数据。每次再加入数据时,先用is_full函数检验是否满。如果is_full返回真的话就用expand扩容,一次写入就结束。然后,顺便练习了一下重载<<。

不过写的时候还踩了一个很是脑残的坑。一开始我想用复制构造函数初始化b数组,然后就写出了如下代码:

D_arraya,b;a=b;

实在是智障啊。。。错误的原因是:创建b数组时,通过默认构造函数初始化。然后再没有释放已分配的内存空间情况下就直接又用复制构造函数再一次初始化了b。所以在调用析构函数时,发生报错。

顺便分享一篇很不错的文章:http://www.cnblogs.com/raichen/p/4752025.html 详细介绍了C++复制构造函数,我是看了这篇文章才发现的错误。