运算符重载-----实例研究:Array类

运算符重载-----实例研究:Array类

说明:在本例中,创建了一个功能强大的数组类Array,它能够进行范围检查,从而确保数组下标保持在有效范围内。这个类允许通过赋值运算符把一个数组对象赋值给另一个数组对象。

//Array.h
#ifndef ARRAY_H_INCLUDED
#define ARRAY_H_INCLUDED

#include<iostream>
using namespace std;

class Array
{
    friend  ostream &operator<<(ostream &,const Array &);
    friend  istream &operator>>(istream &, Array &);
public:
    Array(int = 10);//默认构造函数,有一个带默认值的整型参数
    Array(const Array &);//拷贝构造函数,const的引用;如Array a2(a1);a1仅仅是用一下,所以用const;
    ~Array();//析构函数,此类中有必要的操作。
    int getSize() const;//返回数组长度

    const  Array &operator=(const Array &);//赋值运算符重载
    bool operator==(const Array &) const;
    bool operator!=(const Array &right ) const
    {
       return !(*this == right);//调用等于的情况,
    }

    int &operator[]( int );
    int operator[]( int ) const;
private:
    int size;
    int *ptr;//指向整型数组的指针
};

#endif // ARRAY_H_INCLUDED
//Array.cpp
#include<iostream>
using namespace std;

#include<iomanip>
using std::setw;

#include<cstdlib>
using std::exit;

#include "Array.h"

Array::Array( int arraySize )//如 Array a1(5);
{
     size = (arraySize > 0 ? arraySize : 10);//判断size的值是不是大于0;
     ptr = new int[size];//开辟一个整型数组,首地址给ptr;

     for(int i = 0;i < size;i++)
          ptr[i] = 0;//5个元素的初值给的都是0;
}

Array::Array(const Array &arrayToCopy )//拷贝构造函数,如Array a2(a1);用已有的a1对象初始化a2对象。
:size(arrayToCopy.size)//成员初始化器初始化a2的size;
{
     ptr = new int[size];//给a2开辟一个整型数组,指向ptr,长度为a1的长度。

     for(int i = 0;i < size ;i++)
          ptr[i] = arrayToCopy.ptr[i];//给数组的每个元素初始化值都为a1的值;
}

Array::~Array()//如果不提供析构函数,系统也能使用默认的析构函数回收数组对象,但对于new开辟的空间不能被回收。
{
     delete [] ptr;//显式回收开辟的空间。动态回收一定要在析构函数中,因为开辟在构造函数中
}


int Array::getSize() const
{
     return size;//获得数组的长度返回。
}

const Array &Array::operator=(const Array &right)//赋值运算符的重载,如a1 = a2;
{
     if(&right != this)//比较两个对象是不是相同,比较其地址;
     {
         if(size != right.size)//比较a1和a2的size是不是一样;
           {
              delete [] ptr;//把a1开辟的空间回收;
              size = right.size;//把a2 size 的大小赋值给a1;
              ptr = new int[size];//把a1重新开辟一块空间和a2一样大;
           }

           for(int i = 0;i < size;i++)
               ptr[i] = right.ptr[i];//把a2的元素依次赋值给a1;
     }
     return *this;//返回被a2赋值后的a1;
     /*此时用户抓住了a1的使用权,但开头有const限制,所以避免了(a1 = a2) = a3的操作。*/
}

bool Array::operator==(const Array &right) const//判断两数组是不是一样运算符的重载;
{
     if(size != right.size)//如果两个长度不一样
          return false;

     for(int i = 0;i < size;i++)
     {
          ptr[size] != right.ptr[size];//依次比较每个元素是不是一样;
     }
     return false;

     return true;
}

int &Array::operator[](int subscript)//取数组元素运算符的重载,如a[2]
{
     if(subscript < 0 || subscript >= size)//如果输入的数组下标不符合,直接错误。
     {
          cerr << "\nError:subscript " << subscript
           << "out of range " << endl;
           exit(1);
     }

     return ptr[subscript];//否则直接返回ptr数组对应德下标。
}//返回的是引用,其实是返回的地址的操作权能够被掌握。即可以做该操作:a[3] = 10;

int Array::operator[]( int subscript ) const//const版本返回的没有引用,
{
       if(subscript < 0 || subscript >= size)//如果输入的数组下标不符合,直接错误。
     {
          cerr << "\nError:subscript " << subscript
           << "out of range " << endl;
           exit(1);
     }

     return ptr[subscript];//否则直接返回ptr数组对应德下标。
}//const对象调用const函数,即 const对象不能被修改,如a[3] = 10错误。

istream &operator>>(istream &input,Array &a)//输入运算符重载;
{
     for(int i = 1;i < a.size;i++)
     {
          input>>a.ptr[i];//依次输入
     }

     return input;
}

ostream &operator<<(ostream &output,const Array &a)//输出运算符的重载 ;
{
     int i;
     for(i = 1;i < a.size;i++)
     {
          output << setw(12) << a.ptr[i];//依次输出,宽度为12;

          if((i+1) % 4 == 0)
               output << endl;
     }

     if(i %4 != 0)
          output << endl;

     return output;
}
//ArrayTest.cpp
#include<iostream>
using namespace std;

#include "Array.h"

int main()
{
     Array integers1(7);
     Array integers2;

     cout << "Size of Array integers1 is :"
        << integers1.getSize()
        << "\nArray after initialization :\n" << integers1;

     cout << "\nSize of Array integers2 is :"
        << integers2.getSize()
        << "\nArray after initialization :\n" << integers2;

     cout << "\nEnter 17 integers :" << endl;
     cin>>integers1 >> integers2;//键盘输入17个整数;

     cout << "\nAfter input ,the Arrays contain :\n"
         << "integers1:\n" << integers1
         << "integers2:\n" << integers2;//再次输出integers1和integers2认证;

     cout << "\nEvaluating:integers1 != integers2" << endl;

     if(integers1 != integers2)
          cout << "integers1 and integers2 are not equal" << endl;

     Array integers3(integers1);//拷贝构造函数integers1实例化integers3;

     cout << "\nSize of Array integers3 is "
          << integers3.getSize()
          << "\nArray after initialization:\n" << integers3;//测试integers3是不是和integers1一样

     cout << "\nAssigning integers2 to integers1:" << endl;
     integers1 = integers2;//赋值操作

     cout << "integers1:\n" << integers1
          << "integers2:\n" << integers2;//输出看是不是相等。

     cout << "\nEvaluating:integers1 == integers2" << endl;
     if(integers1 == integers2)
          cout << "integers1 and integers2 are equal" << endl;

     cout << "\nintegers1[5] is " << integers1[5];//取integers1第5个元素

     cout << "\n\nAssigning 1000 to integers1[5]" << endl;
     integers1[5] = 1000;
     cout << "integers1:\n" << integers1;//非const,左值可以修改

     cout << "\nAttempt to assign 1000 to integers1[15]" << endl;
     integers1[15] = 1000;//下标越界,结束;

     return 0;
}

运行结果展示:
在这里插入图片描述
在这里插入图片描述

发布了10 篇原创文章 · 获赞 227 · 访问量 4003

猜你喜欢

转载自blog.csdn.net/m0_46518461/article/details/105461126