《C++程序设计POJ》《WEEK4 运算符重载》《长度可变的整型数组类》

CArray a2(a1);

如果使用系统默认的复制构造函数,只会复制成员变量

a2.ptr = a1.ptr 浅拷贝 内存垃圾

赋值号 = 需要重载 浅拷贝 深拷贝

#include<iostream>
using namespace std;

class CArray
{
    int size; //数组元素的个数
    int* ptr; //指向动态分配的数组
public:
    CArray(int s = 0); //s代表数组元素的个数
    CArray(CArray &a); // copy constructor
    ~CArray();
    void push_back(int v);//用于在数组尾部添加一个元素v
    CArray & operator=(const CArray& a);//用于数组对象间的赋值
    
    int length() { return size; }
    int & CArray::operator[](int i)
    {
        return ptr[i];
    }

}; 
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;
}
CArray::~CArray()
{
    if (ptr)
        delete[] ptr;
}
CArray& CArray::operator= (const CArray& a)
{
    if (ptr == a.ptr)
        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;
} // CArray & CArray::operator=(const CArray & a)

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;
    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] << " ";
    while (1);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/focus-z/p/11013348.html