北大C++课后记录:可变长数组类的实现

#include 
#include 
#include 
#include 
using namespace std;

class CArray{
    private:
    int size;       //实时记录数组元素个数
    int* ptr;       //动态分配内存

    public:
    CArray(int s = 0);
    CArray(CArray &a);      //复制构造函数
    ~CArray();
    void push_back(int v);

    CArray& operator = (const CArray &a);       //深拷贝,同时为遵循“=”的特性 ——> 返回值设为引用
    int length() { return size; }
    int& operator [] (int i){       //不仅要实现xx = a[i] 还要为了实现a[i] = xx ——>浅拷贝
        return ptr[i];          
    }

};

CArray :: CArray(int s): size(s){
    if(!s)      ptr = NULL;
    else        ptr = new int[s];       //开辟一片s大小的连续空间
}

CArray :: CArray(CArray &a){        //Copy Constructor ——> 希望构造出的对象是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 NULL错
        delete[] ptr;
    }
}

CArray& CArray :: operator = (const CArray &a){
    if(ptr == a.ptr)       //防止后面常规赋值把自己delete掉后又进行赋值错
        return *this;

    if(!a.ptr){     //赋NULL值
        if(ptr)     delete[] ptr;
        ptr = NULL;
        size = 0;
        return *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=NULL和size=0成对出现
    ptr[size ++] = v;
}

int main(){         //补充CArray相关定义使得满足以下↓功能
    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;        //a2是空的
    for(int i = 0;i < a2.length();i ++)
        cout << a2[i] << ' ';
    cout << endl;
    a[3] = 100;
    CArray a4(a);       //复制构造函数
    for(int i = 0;i < a4.length();i ++)
        cout << a4[i] << ' ';
    cout << endl;
    return 0;
}

你可能感兴趣的:(北大C++MOOC,c++,数据结构)