六、 可变长数组类的实现

 

1. 示例:

class Carray

{

int size; // 数组元素个数

int* ptr; // 指向动态分配的数组

public:

Carray(int s = 0); // s代表数组元素个数

Carray(const Carray & a);

~Carray();

void push_back(int v); // 用于在数组尾部添加一个元素v

Carray& operator = (const Carray & a); // 用于数组对象间的赋值

int length() { return size; } // 返回数组元素个数

int& operator[](int i) //

{

// 用以支持根据下标访问数组元素,如 a[i] = 4 和 n = a[i] 这样的语句

return ptr[i];



}

};

Carray::Carray(int s) :size(s)

{

if (s == 0)

ptr = NULL;

else

ptr = new int[s];

}



Carray::Carray(const 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;

}



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]; // 重新分配空间 可以采用一种高效的方法,如:一次分配32个元素,等到超过32个元素就分配64个,以此类推。

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); // 要用动态分配的内存来存放数组元素,需要一个指针成员变量

for (int i = 0; i < a.length(); i++) {

cout << a[i] << " ";

}

cout << endl;

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] << " ";

std::cout << "Hello World!\n";

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值