/* (程序頭部註釋開始)
* 程序的版權和版本聲明部分
* Copyright (c) 2011, 煙臺大學計算機學院學生
* All rights reserved.
* 文件名稱:
* 作 者: 王明星
* 完成日期: 2012 年 5 月 22日
* 版 本 號:
* 對任務及求解方法的描述部分
* 輸入描述:
* 問題描述:類中的純虛函數
* 程序頭部的註釋結束
*/
#include <iostream>
using namespace std;
class MyArray
{
private:
int *arr; //用於存放動態分配的數組內存首地址
int size; //數組大小
public:
MyArray(int sz=50);
MyArray(int a[],int sz); //由一個內置類型的數組初始化
MyArray(const MyArray &A); //複製構造函數
~MyArray(void); //析構函數,注意釋放空間
MyArray&operator =(const MyArray &A); //重載“=”使得數組對象可以整體賦值
int& operator[](int i); //重載[],使得Array對象也可以如C++普通數組一樣,用a[i]形式取出值【選做】
bool operator == (MyArray& A); //重載==,使得Array對象能整體判斷兩個數組是否相等(size相等且對應元素相等)
MyArray operator + (MyArray& A); //重載+,使兩個Array對象可以整體相加(前提大小相等)【選做】
friend ostream& operator << (ostream& out,MyArray& A); //重載<<,輸出數組
int GetSize(void)const; //取數組大小;
void Resize(int sz); //修改數組的大小,如果sz大於數組的原大小,增加的元素初始爲;如果sz大於數組的原大小,捨棄後面的元素【選做】
};
//以下爲類成員函數的定義
//構造函數
MyArray::MyArray(int sz)
{
if(sz<=0)
{
cout<<"invalid Array Size!";
exit(1);
}
size=sz; //將元素個數賦值給變量size
arr=new int[size];//動態分配內存,將size個int類型的元素空間分配出來
for(int i=0; i<size; ++i)
*(arr+i)=0;
}
MyArray::MyArray(int a[],int sz)
{
if(sz<=0)
{
cout<<"invalidArraySize";
exit(1);
}
size=sz;//將元素個數賦值給變量size
arr=new int[size];//動態分配內存,將size個int類型的元素空間分配出來
for(int i=0; i<size; ++i)
*(arr+i)=*(a+i);
}
//析構函數
MyArray::~MyArray(void)
{
delete []arr;
}
//複製構造函數//或者拷貝構造函數
MyArray::MyArray(const MyArray& A)
{
//從對象A取得數組大小,並賦給當前對象成員
int n=A.size;
size=n;
//爲對象申請內存並進行出錯檢測
arr=new int[n];
//從對象A複製數組元素到本對象
int *srcptr=A.arr;//X.arr是對象A的數組首地址
int *destptr=arr;//arr是本對象中的數組首地址
while(n--)
{
*destptr=*srcptr;
destptr++;
srcptr++;
}
}
//重載'='
MyArray& MyArray::operator =(const MyArray &A)
{
int n=A.size;//取A數組的大小
//如果本對象中的數組大小和A不同,則刪除數組原有的內存,然後重新分配
if (size!=n)
{
delete []arr;
arr=new int[n];
size=n;
}
//從rhs向本對象複製元素
int* destptr=arr;
int* srcptr=A.arr;
while(n--)
{
*destptr=*srcptr;
destptr++;
srcptr++;
}
return *this;//返回當前對象的引用
}
//重載[]
int &MyArray::operator[](int n)
{
if(n<0||n>size-1)
{
cout<<"indexOutOfRange"<<endl;
exit(1);
}
return arr[n];
}
bool MyArray::operator == (MyArray& A)
{
bool eq=true;
int n=A.size; //取A數組的大小
if (size!=n) //大小是否一致
{
eq=false;
}
else
{
int* destptr=arr;
int* srcptr=A.arr;
while(n--)
{
if(*destptr!=*srcptr)
{
eq=false;
break;
}
destptr++;
srcptr++;
}
}
return eq;//返回當前對象的引用
}
MyArray MyArray::operator + (MyArray& A)
{
int n=A.size; //取A數組的大小
if (size!=n) //大小不一致不能相加
{
cout<<"not same size for add!"<<endl;
exit(1);
}
MyArray a(n); //指定size的數組
for (int i = 0; i < size; i++)
{
a[i]=arr[i]+A[i];
}
return a;//返回當前對象的引用
}
ostream& operator << (ostream& out, MyArray& A)
{
for (int i = 0; i < A.size; i++)
{
out<<A[i]<<'\t';
}
out<<endl;
return out;
}
//取當前數組大小
int MyArray::GetSize(void)const
{
return size;
}
//將數組大小修改爲sz
void MyArray::Resize(int sz)
{
if(sz<=0)
{
cout<<"invalidArraySize"<<endl;
exit(1);
}
if(sz==size)
return;
int *newlist=new int[sz];
for (int i = 0; i < sz; i++)
{
*(newlist+i)=0;
}
int n=(sz<=size)?sz:size;
int *srcptr=arr;
int *destptr=newlist;
while(n--)
{
*destptr=*srcptr;
destptr++;
srcptr++;
}
delete []arr;
arr=newlist;
size=sz;
}
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int b[10]={4,5,6,7,8,9,10,11,12,13};
MyArray arr1(a,10);
MyArray arr2(b,10);
MyArray arr3(10);
cout<<arr3;
arr3 = arr1 +arr2;
cout<<arr3;
arr3.Resize(20);
cout<<arr3;
arr3.Resize(5);
cout<<arr3;
system("pause");
return 0;
}
上機感言:這周的任務感覺有難度,程序是看了別人的之後又自己寫的,就當是挑戰自己了!