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;
}
有帮助的话可以点个赞,我会很开心的~
分类:
《程序与设计算法三》实现代码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通