請教一下 賀老師。 第十四周C++【任務1】建立專門的數組類處理有關數組的操作

【任務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;  怎麼不行呢??





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章