动态数组类的封装

//MyArray.h  头文件

#ifndef _MYARRAY_H_

#define _MYARRAY_H_
#include <iostream>
using namespace std;
class Array
{
friend ostream& operator<<(ostream& out, Array &a);
private:
double *m_Data;
int m_Size;
int m_Max;
private:
void Init();
void Free();
inline bool InvalidateIndex(int nIndex);
public:
Array();    //构造函数
Array(int nsize,double dValue = 0);   //带参的构造函数
Array(const Array & arr);  //拷贝构造一个数组
Array & operator=(const Array &arr);  //拷贝复制运算符的重载
~Array();       //析构函数
int GetSize();   //获取数组的大小
double GetAt(int nIndex);  //获取指定位置元素的值
void SetAt(int nIndex,double dValue); //重置指定元素的值

double &operator[](int nIndex);


//MyArray.cpp   实现函数

#include "MyArray.h"
#include <iostream>
void Array ::Init()
{
m_Size=0;
m_Max=1;
m_Data=new double[m_Max];
}


void Array::Free()
{
delete []m_Data;
}


bool Array::InvalidateIndex(int nIndex) //参数bErase为TRUE时,重绘区域内的背景将被擦除,否则,背景将保持不变。
{
if(nIndex>=0 && nIndex<m_Size)
return false;                 //合法,背景保持不变   
else
return true;
}


Array ::Array()
{
Init();
}


Array::Array(int nSize,double dValue)
{
if(nSize == 0)
{
Init();
}
else
{
m_Size=nSize;
m_Max=nSize;
m_Data=new double[m_Max];
for(int i=0;i<nSize;++i)
m_Data[i]=dValue;
}
}


//拷贝构造函数 拷贝构造一个数组
Array::Array(const Array & arr)
{
m_Size=arr.m_Size; //复制常规成员
m_Max=arr.m_Max;
m_Data=new double[m_Max];  //复制指针指向的内容
memcpy(m_Data,arr.m_Data,m_Size*sizeof(double));
}

Array& Array::operator=(const Array &arr)    //拷贝赋值运算符的重载
{
/*if(this == &arr) //自赋值
return *this;
m_Size=arr.m_Size;
m_Max=arr.m_Max;
//先将右侧对象拷贝到临时对象中,然后再销毁左侧对象
double *m_temp= new double[m_Max];
memcpy(m_temp,arr.m_Data,m_Size*sizeof(double));
delete [] m_Data;
m_Data=m_temp;
return *this;*/
Array temp=arr;
double *p=temp.m_Data;
temp.m_Data=m_Data;
m_Data=p;
m_Size=temp.m_Size;
m_Max=temp.m_Max;
return *this;
}

Array::~Array()
{
Free();
}

//打印数组
/*void Array::Print()
{
if(m_Size == 0)
{
cout<< "ERROR :The empty array can't be Printed."<<endl;
exit(0);
}
else
{
for(int i=0;i<m_Size;i++)
{
out<<m_Data[i]<<" ";


}
out<<endl;
}
}*/


int Array::GetSize()  //获取数组的大小
{
return m_Size;
}


double Array::GetAt(int nIndex)
{
if(InvalidateIndex(nIndex))
{
printf("Error:the index of GetAt is invalid!");
exit(0);
}
return m_Data[nIndex];
}


void Array::SetAt(int nIndex,double dValue)
{
if(InvalidateIndex(nIndex))
{
printf("Error:the index of SetAt is invalid");
exit(0);
}
else
{
m_Data[nIndex]=dValue;
   }
}
double & Array::operator[](int nIndex)
{
if(InvalidateIndex(nIndex))
{
printf("Error:the index  is invalid");
exit(0);
}
return m_Data[nIndex];
}

//main函数  主函数

#include <iostream>

#include "MyArray.h"
using namespace std;
ostream& operator<<(ostream& out, Array &arr)
{
for (int i=0; i<arr.m_Size; i++)
{
// 获取数组元素 ,参数表示数组下标
cout<< arr[i] << " ";
}
return out;
}

int main ()
{
Array a1(10);


for(int i=0;i<a1.GetSize();i++)
{
a1.SetAt(i,i+1);
}


cout<<"\n打印数组a1: ";
for (int i=0; i<a1.GetSize(); i++)
{
// 获取数组元素 ,参数表示数组下标
cout<<a1.GetAt(i)<<" ";
}
cout<<endl;


Array a2=a1;
cout<<"\n打印数组a2: ";
for (int i=0; i<a2.GetSize(); i++)
{
cout<<a2.GetAt(i)<<" ";
}
cout<<endl;
cout<<a2<<endl;

cout<<"hello..."<<endl;

return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值