【任務1】建立專門的數組類處理有關數組的操作
數組是幾乎所支持的組織數據的方法。C和C++對數組類型提供了內置支持,使我們利用數組實現軟件中需要的各種實用的功能。但是,這種支持僅限於用來讀寫單個元素的機制。C++不支持數組的抽象abstraction,也不支持對整個數組的操作。例如:把一個數組賦值給另外一個數組,對兩個數組進行相等比較或者想知道數組的大小size,等等。對C++而言,數組是從C語言中繼承來的,它反映了數據與對其進行操作的算法的分離,有濃厚的過程化程序設計的特徵。數組並不是C++語言的一等公民。所以在實際項目中,對一個C++程序員,更多的是使用標準庫中提供的Vector類型實現數組功能。這個任務也將從面向對象角度重新審視和理解數組,進而掃清自學Vector等標準類中可能存在的障礙。
在下面代碼的基礎上,完成支持數組操作的類的設計,增強C++內置數組類型功能。
#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小於數組的原大小,捨棄後面的元素【選做】
};
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;
}
【任務1擴展一(選做)】規定MyArray只能處理元素爲整型的數據未免太弱了,請設計成模板類,使之適應各種類型(事實上,C++增加的標準類對些類情況均設計成了模板類)。
【任務1擴展二(選做)】可以施加於數組的操作還有很多,例如最經典的排序,還有求最大、最小、查找某一元素、截取其中的片段(取從第5個互第10個之間的所有元素,可以形成新的數組對象)、向量乘法,……。將這些操作構造爲類的成員函數,開始拓展之旅吧!
#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)
{
arr=new int[sz];
size=sz;
for(int i=0;i<sz;i++)
arr[i]=0;
}
MyArray::MyArray(int a[],int sz) //由一個內置類型的數組初始化
{
arr=new int[sz];
size=sz;
for(int i=0;i<sz;i++)
arr[i]=a[i];
}
MyArray::MyArray(const MyArray &A) //拷貝構造函數
{
arr=new int[A.size];
for(int i=0;i<A.size;i++)
arr[i] = A.arr[i];
size=A.size;
}
MyArray::~MyArray(void)//析構函數,注意釋放空間
{
delete [] arr;
}
MyArray& MyArray::operator =(const MyArray &A) //重載“=”使得數組對象可以整體賦值
{
arr=new int[A.size];
size=A.size;
for(int i=0;i<A.size;i++)
arr[i] = A.arr[i];
return *this;
}
int& MyArray::operator[](int i) //重載[],使得Array對象也可以如C++普通數組一樣,用a[i]形式取出值【選做】
{
return arr[i];
}
bool MyArray::operator == (MyArray& A) //重載==,使得Array對象能整體判斷兩個數組是否相等(size相等且對應元素相等)
{
arr=new int[A.size];
if(size==A.size)
{
for(int i=0;i<size;i++)
{
if (arr[i]!=A.arr[i])
return false;
}
return true;
}
else return false;
}
MyArray MyArray::operator + (MyArray& A) //重載+,使兩個Array對象可以整體相加(前提大小相等)【選做】
{
int i;
MyArray a(A);
for(int i = 0; i < size; ++i)
a.arr[i]=arr[i]+A.arr[i];
return a;
}
ostream& operator << (ostream& out,MyArray& A) //重載<<,輸出數組
{
for(int i = 0; i < A.size; i++)
{
out << *(A.arr + i)<<" ";
}
return out;
}
int MyArray::GetSize(void)const //取數組大小;
{
return size;
}
void MyArray::Resize(int sz) //修改數組的大小,如果sz大於數組的原大小,增加的元素初始爲;sz小於數組的原大小,捨棄後面的元素【選做】
{
int *m,i;
m = new int[sz];
if(sz > size)
{
for( i = 0; i < size; ++i)
*(m + i) = *(arr + i);
for(i = size; i < sz; ++i)
*(m + i) = 0;
}
else
{
for(i = 0; i < sz; ++i)
*(m + i) = *(arr + i);
}
arr = new int[sz];
for(i = 0;i < sz; ++i)
*(arr + i) = *(m + i);
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<<endl;
arr3 = arr1 +arr2;
cout<<arr3<<endl;
arr3.Resize(20);
cout<<arr3<<endl;
arr3.Resize(5);
cout<<arr3<<endl;
system("pause");
return 0;
}
*** 請教老師個問題::
MyArray& MyArray::operator =(const MyArray &A) //重載“=”使得數組對象可以整體賦值
{
arr=new int[A.size];
size=A.size;
for(int i=0;i<A.size;i++)
arr[i] = A.arr[i];
return *this;
}
在這裏*this 指代的就是arr 啊, 但是return arr; 怎麼不行呢??