可变长数组类的实现

可变长数组类的实现

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 &operator[](int i)   //非引用的函数返回值不能作为左值使用
    {
        return ptr[i];  //用以支持根据下标访问数组元素,如n = a[i]; a[i] = 4;
    }
};

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;
}
/*
原型:extern void *memcpy(void *dest, void *src, unsigned int count);
用法:#include <string.h>
功能:由src所指内存区域复制count个字节到dest所指内存区域。
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。
*/

CArray::~CArray()
{
    if(ptr)
        delete []ptr;
}

CArray &CArray::operator=(const CArray &a)  //赋值号的作用是使“=”左边对象里存放的数组大小和内容都和右边对象一样。
{
    if(ptr == a.ptr)  //防止a = a这样的赋值导致出错
        return *this;
    if(a.ptr == NULL)  //如果a里面的数组是空
    {
        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[size++] = v;  //加入新的数组元素
}

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;   //a2是空的
    for(int i = 0; i < a2.length(); ++i)  //a2.length()返回0
        cout << a2[i] << " ";
    cout << endl;
    a[3] = 100;
    CArray a4(a);   //要自己写复制构造函数
    for(int i = 0; i < a.length(); ++i)
        cout << a4[i] << " ";

    return 0;
}
/*
输出:
0 1 2 3 4 
0 1 2 100 4
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值