运算符重载实例:数组

 

问题:C和C++中数组是一个指针:大小为n的数组下标必须是0、1、2……n-1,下标不允许改变;不能一次输入或者输出数组,只能单独的对数组元素操作;不能用相等运算符或者关系运算符比较数组,因为数组名是指向内存中数组起始位置的指针;传递数组时,数组大小通常也要传递;不能用赋值运算把一个数组赋给另外一个数组,因为数组名是const类型指针,常量指针是不能再赋值运算的左边的。

本例建议一个数组类,实现功能

1.      检测数组下标不会越界

2.      将一个数组赋值给另一个数组

3.      传递数组时,自动知道数组大小,不用传递数组大小

4.      整体输入输出数组

5.      比较数组

 

//头文件array1.h

#ifndef ARRAY1_H
#define ARRAY1_H

#include<iostream.h>

class Array{
 
 //当运算符函数是一个成员函数,最左边操作数必须是运算符类的一个对象(或者其引用)
 //如果左边操作数必须是一个不同类的对象或者一个内部类型对象,那么该函数必须作为一个非成员函数
 //要访问private and protected 数据成员,必须有元
 friend istream &operator>> (istream &, Array &);
 friend ostream &operator<< (ostream &, const Array &);

public:
 Array(int = 10);
 Array( const Array &);
 ~Array();

 int getSize() const;
 //赋值重载
 const Array &operator= (const Array &);
 //比较重载:== 和 !=(!= 用 == 来实现)
 bool operator==(const Array &) const;
 bool operator!=(const Array &) const;

 //操作数组任意元素
 int &operator[]( int );
 const int &operator[] (int) const;

 static int getArrayCount();

private:
 //数组长度
 int size;
 //指向一个数组元素的指针
 int *ptr;
 static int arrayCount;

};

#endif

 

//array.cpp

#include <iostream.h>
#include <iomanip.h>
#include <stdlib.h>
#include <assert.h>

#include "array1.h"

int Array::arrayCount = 0;

Array::Array(int arraySize)
{
 size = (arraySize >0 ? arraySize : 10);
 ptr = new int [size];
 assert (ptr != 0);
 ++arrayCount;

 for (int i = 0; i < size; i ++)
 {
  ptr[i] = 0;
 }
}

Array::Array( const Array &init) : size(init.size)
{
 ptr = new int [size];
 assert(ptr != 0);
 ++arrayCount;
 for(int i = 0; i < size; i++)
  ptr[i] = init.ptr[i];
}

Array::~Array()
{
 delete [] ptr;
 --arrayCount;
}

int Array::getSize() const
{
 return size;
}

const Array &Array::operator = ( const Array &right)
{
 if(&right != this)   //check for self-assignment
 {
  if(size != right.size) 
  {
   delete [] ptr;
   size = right.size;
   ptr = new int[size];
   assert(ptr != 0);
  }
  for(int i = 0; i < size; i++)
   ptr[i] = right.ptr[i];

 }
 return *this;
}

bool Array::operator ==(const Array &right) const
{
 if(size != right.size)
  return false;
 for(int i = 0; i<size; i++)
  if(ptr[i] != right.ptr[i])
   return false;
 return true;

}

bool Array::operator != (const Array &right) const
{
 return !(*this == right);//!!!!
}

//for non-const Array
int &Array::operator[] (int subscript)
{
 assert(0 <= subscript && subscript <= size);
 return ptr[subscript];
}

//for const array

const int &Array::operator[](int subscript) const
{
 assert (0 <= subscript && subscript <= size);
 return ptr[subscript];
}

int Array::getArrayCount() {return arrayCount;}

istream &operator>> (istream &input, Array &a)
{
 for(int i = 0; i < a.size; i++)
  input >> a.ptr[i];
 return input;
}

ostream &operator<< (ostream &output, const Array &a)
{
 int i = 0;
 for (; i < a.size; i++)
 {
  output << setw(12) << a.ptr[i];
  if((i+1)%4 == 0)
   output << endl;
 }

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

 return output;
}

 

//主函数

#include <iostream.h>
#include "array1.h"

int main()
{
 //no object
 cout << Array::getArrayCount() << endl;

 //生成两个对象,调用构造函数
 Array integer1(7), integer2;
 cout << Array::getArrayCount() << endl;

 cout << "the first array: \n" << integer1.getSize() << '\n'
  << integer1 << '\n\n';

 cout << "the second array: \n" << integer2.getSize() << '\n'
  << integer2 << '\n\n';

 cout << "enter 17 integers: ";
 cin >> integer1 >> integer2;

 cout << "after input: \n"<< integer1.getSize() << '\n'
  << integer1 << '\n\n'<< integer2.getSize() << '\n'
  << integer2 << '\n\n';

 //比较两个数组
 if (integer1 != integer2)
 {
  cout << "不相等\n";
 }
 
 // copy
 Array integer3(integer1);
 cout << "the third array: \n" << integer3.getSize() << '\n'
  << integer3 << '\n\n';

 // 赋值
 integer1 = integer2;
 cout << "the first array: \n" << integer1.getSize() << '\n'
  << integer1 << '\n\n';
 
 cout << "the second array: \n" << integer2.getSize() << '\n'
  << integer2 << '\n\n';

 integer1[2] = 1000;
 cout << integer1 << endl;

 //integer1[20] = 1000;


 return 0;
}

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值