//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;}