您的位置:首页 > 编程语言 > C语言/C++

一个让人灵光一闪的数组C++类Array设计,可以此作为范本进行其他的C++类编写

2017-07-29 16:46 519 查看
一个基于指针和重载操作符的数组类设计Array,可以进行数组范围检查,与平常看到的类而言,这个类的编写让人感觉逻辑十分清晰,以及更加可以理解面向对象程序设计理念。

Arry.h

/*-----防止类头文件重复包含--------------------------------------*/
#ifndef ARRAY_H
#define ARRAY_H
/*-----包含输入输出流头文件--------------------------------------*/
#include <iostream>
using namespace std;
class Array
{
/*-----重载输入输出符号的友元函数--------------------------------------*/
friend ostream &operator<<(ostream &,const Array &);
friend ostream &operator>>(iostream &,Array &);
public:
explicit Array(int = 10);//默认构造函数
Array(const Array &);//拷贝构造函数
~Array();//析构函数
size_t 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:
size_t size;//数据成员size标识数组大小
int *ptr;//数组指针
};
#endif;


Array.cpp

/*-----Array类的函数定义和友元函数定义-------------------------------------*/
#include <iostream>
#include <iomanip>
#include <stdexcept>
#include "Array.h"
using namespace std;

/*------Array类的默认构造函数,数组大小为10--------------------------------*/
Array::Array(int arraysize):size( arraysize>0?arraysize:throw invalid_argument("Arrat size must be greater than 0")),ptr(new int [size])
{
for (size_t i=0;i<size;++i)
{
ptr[i]=0;
}

}

/*-----Array类的拷贝构造函数----------------------------------------------*/
Array::Array(const Array &arrayToCopy):size(arrayToCopy.size),ptr(new int [size])
{
for (size_t i=0;i<size;++i)
{
ptr[i]=arrayToCopy.ptr[i];
}
}

/*-----Array类的析构函数---------------------------------------------------*/
Array::~Array()
{
delete [] ptr;
}

/*-----得到数组的大小-----------------------------------------------------*/
size_t Array::getSize() const
{
return size;
}

/*-----重载=操作符--------------------------------------------------------*/
const Array &Array::operator =(const Array &right)
{
if (*right != this)//避免自己给自己赋值
{
//如果两个数组的大小不一样,那就先释放原有数组
//然后声明与右边数组大小一样的数组
if (size != right.size)
{
delete [] ptr;
size =right.size;
ptr=new int[size];
}
//进行赋值
for (size_t i=0;i<size;++i)
{
ptr[i]=right.ptr[i];
}
}
return *this;
}

/*-----重载==操作符-------------------------------------------------------*/
bool Array::operator ==(const Array &right)const
{
if (size != right.size)//如果两个数组的大小不一样,直接返回false
{
return false;
}
for (size_t i=0;i<size;++i)//如果数组一样,比较对应的元素是否一样,如果不一样,返回false
{
if (ptr[i] != right.ptr[i])
{
return false;
}
}
return true;//不然返回true
}

/*-----重载[]操作符-------------------------------------------------------*/
int &Array::operator [](int subscript)
{
if (subscript<0||subscript>=size)
{
throw out_of_range("Subscript out of range");
}
return ptr[subscript];
}

/*-----重载[]操作符-------------------------------------------------------*/
int Array::operator [](int subscript) const
{
if (subscript<0||subscript>=size)
{
throw out_of_range("Subscript out of range");
}
return ptr[subscript];
}

/*-----友元函数,重载输入运算符>>----------------------------------------*/
iostream &operator>>(istream &input,Array &a)
{
for (size_t i=0;i<a.size;++i)
{
input>>a.ptr[i];
}
return input;
}
/*-----友元函数,重载输入运算符<<----------------------------------------*/
ostream &operator<<(ostream &output,const Array &a)
{
for (size_t i=0;i<a.size;++i)
{
output<<setw(12)<<a.ptr[i];
if ((i+1)%4==0)
{
output<<endl;
}
}
if (a.size%4 !=0)
{
output<<endl;
}
return output;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐