4.4可变长数组类实现

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
class carray
{
    int size;
    int* ptr;//指向数组的指针
public:
    carray(int size);
    carray(carray& a);
    ~carray();
    void push_back(int i);
    carray& operator =(const carray &a);
    int& operator [](int i)//a[i]=4,因为非引用的返回值不能作为=左值使用,因此返回&
    {
        return ptr[i];
    };
    int length() {
        return size;
    };
};
carray::carray(int size=0)
{
    this->size = size;
    if (size > 0)  ptr = new int[size];
    else ptr = NULL;
}
carray::carray(carray& a)
{
    size = a.size;
    if (a.ptr == NULL)
    {
        ptr = NULL;
        return;
    }
    ptr = new int[a.size];
    memcpy(ptr, a.ptr, sizeof(int)*size);
}
carray::~carray()
{
    if (ptr) delete[]ptr;
}
carray& carray::operator=(const carray& a)
{
    if (a.ptr == ptr)  return *this;//如果等号两边对象一样,不用拷贝
    if (a.ptr == NULL)
    {
        size = 0;
        if (ptr) delete[]ptr;
        ptr = NULL;
        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 * tmp = new int[size + 1];
        memcpy(tmp, ptr, sizeof(int)*size);
        delete[]ptr;
        ptr = tmp;
    }
    else if (ptr == NULL) ptr = new int[1];
    //添加元素
    ptr[size++] = v;
}
int main()
{
    carray a;
    for (int i = 0; i < 5; i++)
        a.push_back(i);//pushback成员函数
    carray a2, a3;
    a2 = a;//重载=赋值运算符
    for (int i = 0; i < a.length(); i++)//length成员函数
        cout << a[i] << ' ';//重载[]
    a2 = a3;
    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] << ' ';
    return 0;
}
posted @   穿过雾的阴霾  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示