1.要编写可变长数组类,使之能够如下使用
int main()
{
carray a;
for(int i=0;i<5;i++)
a.push_back(i); //动态内存分配,须要一个指针成员变量
carray a2,a3;
a2=a; //需要重载=
for(int i=0;i<a.length();i++)
cout<<a2[i]<<"" ;
a2=a3;
for(int i=0;i<a2.lengh();++i)
cout<<a2[i]<<""; //需要重载[]
cout<<endl;
a[3]=100;
carray a4(a) ; //自己写复制构造函数
for(int i=0;i<a4.length();i++)
cout<<a4[i]<<"";
return 0;
}
2.细节实现
class carray
{
int size;//数组元素的个数
int *ptr;//指向动态分配的数组
public:
carray(int s=0);//s代表数组元素的个数
carray(carray &a);
~carray();
void push_back(int v);//用于在数组尾巴添加一个元素v
carray & operator =(const carray &a);//勇于数组对象间的赋值
int length(){return size;}//返回数组元素个数
int &carray::operator[](int i)//返回值为int不行!不支持a[i]=4
{//用于支持根据下标访问数组元素,如n=a[i]和a[i]=4这样的语句。
return ptr[i];
};
}
carray::carray(int s):size(s)
{
if(s==0)
ptr=NULL;
else
ptr=new int[s];
}
carray::carray(carray &a)
{
if(!a.ptr){
ptr=NULL;
size=0;
return;
}
ptr=new int[a.size];
memcpy(ptr,a.ptr,sizeof(int)*a.size);
size=a.size;
}
carray::~carray()
{
if(ptr) delete []ptr;
}
carray & carray::operator = (const carray &a)
{
if(ptr==a.ptr)
return *this;
if(a.ptr==NULL){
if(ptr) delete []ptr;
ptr=NULL;
size=0;
retrun *this;
}
if(size<a.size){ /如果原有空间够大,就不用分配新的空间了
if(ptr)
delete []ptr;
ptr=new int[a.size];
}
memcpy(ptr,a.ptr,sizeof(int)*a.size);
size=a.size;
return *this;
}
void carray::push_back(int v)
{
if(ptr){
int *tmpptr=new int[size+1];
memcpy(tmpptr,ptr,sizeof(int)*size);
delete []ptr;
ptr=tmpptr;
}
else
ptr=new int[1];
ptr[size++]=v; //加入新的数组元素
}