C++实现一个变长数组Array类(包括 构造函数,析构函数,拷贝构造函数,运算符重载应用)

C++实现一个变长数组Array类(利用构造函数实现变长)

#include<iostream>

using namespace std;

/**<
    a.能够设置数组元素
    b.用一个对象初始化另一个对象
    c.获取元素
 */
class Array{
    friend ostream& operator<<(ostream& out,Array& obj);
    friend istream& operator>>(istream& in,Array & obj);
private :
    int *p;     //表示数组的首地址
    int length; //表示数组最大存放的大小
public:
    Array(int length);                     //构造函数--利用长度
    ~Array();//析构函数

    void setDate(int index,int data);      //a.能够设置数组元素
    int getDate(int index);                //c.获取元素
    Array(const Array& obj);               //b.用一个对象初始化另一个对象(由于存在指针变量所以用深拷贝)
    int getLength();                       //获取数组元素的长度


    int &operator[](int index);            //重载[]操作符需求:cout<<arr[0];
    bool operator==(Array& obj);           //重载==操作符operator ==(Array& obj)
    bool operator!=(Array& obj);           //重载!=操作符operator !=(Array& obj)
    //ostream& operator<<(ostream& out,Array& obj);//operator<<(ostream& out,Array& obj)
    //istream& operator>>(istream& in,Array& obj);//operator<<(istream& out,Array& obj)
private:
    int index;   //索引
    int date;    //数据
};
/***************************************************************************/
//构造函数--利用长度
Array::Array(int length)
{
    if (length<0) length =0 ;  //正确值判断

    this->length = length;
    p = new int[this->length];
}
/***************************************************************************/
//设置数组元素,利用索引
void Array::setDate(int index, int data)
{
    p[index]= data;
}
/***************************************************************************/
//获取数组元素,利用索引
int Array::getDate(int index)
{
    return p[index];
}
/***************************************************************************/
//拷贝构造函数
Array::Array(const Array& obj)//由于存在指针变量所以用深拷贝
{
    this->length = obj.length;
    p = new int[this->length];
    for(int i =0 ;i <this->length;i++)
        p[i] = obj.p[i];
}
/***************************************************************************/
//获取数组长度
int Array::getLength()
{
    return this->length;
}
/***************************************************************************/
//析构函数,
Array::~Array()
{

    if(p!= NULL)
        delete[] p;
    this->length = 0;  //这里要注意length最后的置为0
}
/***************************************************************************/
//重载[]
int& Array::operator[](int index)
{
    return p[index];
}
/***************************************************************************/
//重载==
bool Array::operator==(Array& obj)
{
    if(this->length !=obj.getLength())
        return false;
    for(int i = 0;i<this->getLength();i++)
        if(this->p[i]!= obj[i])
            return true;

}
//重载!=
bool Array::operator!=(Array& obj)
{
    if(this->operator==(obj))
        return false;
    return true;
}
/***************************************************************************/
//将重载的这个函数定义为友元函数,既然是友元函数,那么就不应该出现Array::,
//因为友元函数并不属于一个类的成员方法,因此将类名和范围解析符删去即可。
ostream& operator<<(ostream& out, Array& obj)
{

    for(int i =0;i<obj.getLength();i++)
        out<<obj.p[i]<<endl;
    return out;
}
istream& operator>>(istream& in,Array& obj)
{
    for(int i = 0;i<obj.getLength();i++)
    {
        in>>obj.p[i];
    }
    return in;
}

/***************************************************************************/
void Test()
{
    Array arr(10);
    //设置元素
    for(int i =0 ;i<arr.getLength();i++)
    //arr.setDate(i,i);
    arr[i]=i;
    cout<<"********************1.需求:cout << arr[0];********************************************"<<endl;
    //1.需求:cout << arr[0];  operator[](int index)
    cout << arr[2]<<endl ;

    cout<<"********************2.需求:arr[0]= ********************************************"<<endl;
   //2.需求:arr[0]=10;(函数的返回值作为左值,应返回引用)修改上面1中的函数
    arr[0] = 10;
    cout << arr[0] << endl;

    cout<<"********************3.需求:b.== !=;********************************************"<<endl;
    //3.需求:b.== !=;  operator==(Arry& obj)
    Array brr(10);
    for (int i=0;i<brr.getLength();i++)
    {
        brr[i] = i +1;
    }
    if (arr == brr)
    {
        cout << "相等" << endl;
    }
    if (arr != brr)
    {
        cout << "不相等" << endl;
    }
    cout<<"********************我们可不可以直接输入或者输出Array对象********************************************"<<endl;
    //我们可不可以直接输入或者输出Array对象
    Array crr(4);

    for (int i=0;i<crr.getLength();i++)
    {
        crr[i] = i + 1;
    }
    cout<<"********************4.需求:cout << crr;********************************************"<<endl;
    //4.需求:cout << crr; cout.operator<<()
    cout << crr;
    cout<<"********************5.需求:cin >> crr;********************************************"<<endl;
    //5.需求:cin >> crr;
    cin >> crr;
    cout <<crr << endl;
/*
    //输出元素
    for(int i =0 ;i<arr.getLength();i++)
        cout<<arr.getDate(i)<<" ";
        cout<<endl;
    cout<<"使用arr初始化brr"<<endl;

    //使用arr初始化brr
    Array brr  =arr;
    for(int i =0 ;i<brr.getLength();i++)
        cout<<brr.getDate(i)<<endl;
*/
}

int main()
{
    Test();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值