第14週タスク1(配列クラス処理に関する専用の操作を確立する)
5269 ワード
/* ( )
*
* 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<<"error!";
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<<"error";
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 *p1=A.arr;//X.arr A
int *p2=arr;//arr
while(n--)
{
*p2=*p1;
p2++;
p1++;
}
}
// '='
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* p2=arr;
int* p1=A.arr;
while(n--)
{
*p2=*p1;
p2++;
p1++;
}
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* p2=arr;
int* p1=A.arr;
while(n--)
{
if(*p2!=*p1)
{
eq=false;
break;
}
p2++;
p1++;
}
}
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 *p1=arr;
int *p2=newlist;
while(n--)
{
*p2=*p1;
p2++;
p1++;
}
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;
}
経験の蓄積:
プログラム内の複製構造関数は難易度があり、int*p 1=A.arr;//X.arrはオブジェクトAの配列ヘッダint*p 2=arr;//arrは、本オブジェクトの配列ヘッダアドレスwhile(n−){*p 2=*p 1;p 2++;p 1+;}このセグメントがポイントであり、長さを判断して再割り当てするif(size!=n){delete[]arr;arr=new int[n];size=n; }
見た先生の...