模拟标准库vetor类写一个简易的变长整数型数组

c++标准库中有一个边长数组类vector,为了巩固前面学习的关于运算符重载以及构造函数的知识,在此模拟标准库,自定义一个简易的int型的变长数组类CArray。这个类在效率上存在一定的缺陷,只做学习中。

#include<iostream>
#include<cstring>
using namespace std;
class CArray{
private:
    int *ptr;
    int size;
public:
    CArray(){
        ptr = NULL;
        size = 0;
    }//无参构造函数
    void push_back(int v);//向数组末尾追加元素
    CArray & operator=( CArray& array1);//实现数组对象深拷贝
    int & operator[](int i);//实现通过下标访问数组元素
    int length()const{		//通过成员函数访问数组长度
        return size;
    }   //ok
    CArray(const CArray & array1);//复制构造函数
    ~CArray(){					  //析构函数,释放动态分配内存
        if(ptr){
            delete []ptr;
        }
    }
};

CArray::CArray( const CArray & array1){
    if(!(array1.ptr)){//如果用来初始化的对象本身就是空的
        (*this).size = 0;
        (*this).ptr=NULL;
    }else{//如果用来初始化的对象本身不是空的
        ptr = new int[array1.size];// 给当前对象分配内存空间,大小与array一样
        memcpy(ptr,array1.ptr,sizeof(int)*array1.size);
        (*this).size = array1.size;
    }

}

CArray & CArray::operator=(CArray& array1){
    if(ptr==array1.ptr){//自己之间的赋值,直接返回
        return *this;
    }
    if(ptr!=NULL){//如果左边原本不是空的,先把左边清空
        delete []ptr;
        ptr=NULL;
        size=0;
    }
    if(array1.ptr==NULL){ //如果右边为空,直接返回
        return *this;
    }else{//如果右边不为空,将右边对象的数据拷贝到左边对象
        ptr = new int[array1.size];//为左边的ptr开辟新的内存空间,大小为array1所指向的大小
        memcpy(ptr,array1.ptr,sizeof(int)*array1.size);//将array1.ptr指向的内存空间的 前x 字节拷贝一份到 ptr指向的内存空间中
        (*this).size=array1.size;
    }
    return *this;
}
int& CArray::operator[](int i){
    return ptr[i];
}


void CArray::push_back(int push_data){
    if(ptr){//str之前就已经指向了数据
        int *p = new int[size+1];
        memcpy(p,ptr,sizeof(int)*size);   //1:指针指向的数组之间的拷贝问题。
        delete []ptr;                     //2:ptr指向的是一个int数组,因此应该释放数组
        ptr=p;
    }
    else{//str 之前指向空
        ptr = new int[1];               //这里不能写成new int   因为对应着析构函数,要统一
    }
    ptr[size++]=push_data;              //3:先执行ptr[size]=push_data;再执行size++
}


int main(){ 
    CArray a; //创建一个CArray数组a。  需要定义无参构造函数
    for( int i = 0;i < 5;++i)//向元素末尾存放值    
        a.push_back(i);
    CArray a2,a3;//再创建两个CArrary数组a2,a3
    cout <<"-------test operator=------"<< endl;
    a2 = a; //将数组a赋值给数组a2   测试深拷贝
    for( int i = 0; i < a2.length(); ++i ) //遍历数组a2   
        cout <<a2[i] << " " ;
    cout <<endl<<"---------------------------"<< endl;

    cout <<endl<<"-------a2输出应该为空------"<< endl;
    a2 = a3; //a2是空的程序输出结果是:
    for( int i = 0; i < a2.length(); ++i ) //a2.length()返回0
        cout << a2[i] << " ";
    cout <<endl<<"---------------------------"<< endl;

    cout <<endl<<"--- test a[3]=100 a4(a)----"<< endl;
    a[3] = 100;                 //修改 3位置的int数  需要重载[]   使其接收一个int型变量(索引),返回值是该位置的引
    CArray a4(a);               //在初始化时,用一个对象初始化另外一个对象。     需要定义复制构造函数
    for( int i = 0; i < a4.length(); ++i )
        cout <<a4[i] << " ";//要做哪些事情?
    cout <<endl<<"---------------------------"<< endl;

    return 0;
}
posted @ 2019-11-27 22:53  江南又一春  阅读(177)  评论(0编辑  收藏  举报