一、实验目的:
– 综合运用C++语言的知识,用面向对象的程序设计思想分析系统以及类与类之间的关系,主函数通过定义类的对象等机制来实现所有功能。
– 合理抽象所需要定义的类,定义类中的数据成员及成员函数,提供接口实现相关功能。
– 分析系统所需要定义的多个类之间的关系,合理规划。
– 编写一个面向对象编程的程序,需要涵盖类和对象定义,构造函数各种情况、友元、运算符重载、成员对象,继承等内容。
二、实验内容
创建理想的数组类
三、实验思路
定义Array类,他的数据成员是指向数据元素的指针elems和数组元素个数len。根据运算符重载方针,在该类中重载operator=()、operator【】()为类的成员函数,重载operator==()和operator!=()为类的友元函数。定义能进行边界检查的成员函数BorderCkeck(int i)、他能检查下标i是否越界,若越界,返回false,否则返回true
重载+-*/运行算符,功能为两个数组对应项的两个数字做运算。
四、实验过程
1.实验代码
#include <iostream>
#include <assert.h>
#include <stdlib.h>
using namespace std;
class Array
{
friend bool operator == (const Array &,const Array &);
friend bool operator != (const Array &,const Array &);
friend Array operator +(const Array &,const Array &);
friend Array operator -(const Array &,const Array &);
friend Array operator *(const Array &,const Array &);
friend Array operator /(const Array &,const Array &);
public :
Array(int *e = NULL,int l=0):elems(e),len(l) {}
~Array() { delete [] elems; }
bool BorderCheck(int i)const;
int length() const;
int & operator[](int i);
int operator[](int i)const;
const Array&operator = (const Array&a);
private:
int *elems;
int len;
};
bool operator == (const Array &a1,const Array &a2)
{
if(a1.len != a2.len)
{
return false;
}
else
{
for(int i;i < a1.len;i++)
{
if(a1[i] != a2[i])
{
return false;
}
}
return true;
}
}
bool operator != (const Array &a1,const Array &a2)
{
if(a1.len != a2.len)
{
return true;
}
else
{
for(int i;i < a1.len;i++)
{
if(a1[i] != a2[i])
{
return true;
}
}
return false;
}
}
Array operator +(const Array &a,const Array &b)
{
Array t;
t.elems = new int[a.len]; //为elems重新分配一段内存
t.len = a.len;
for(int i=0;i<a.len;i++)
{
t.elems[i] = a.elems[i] + b.elems[i];
}
return t;
}
Array operator -(const Array &a,const Array &b)
{
Array t;
t.elems = new int[a.len];
t.len = a.len;
for(int i=0;i<a.len;i++)
{
t.elems[i] = a.elems[i] - b.elems[i];
}
return t;
}
Array operator *(const Array &a,const Array &b)
{
Array t;
t.elems = new int[a.len];
t.len = a.len;
for(int i=0;i<a.len;i++)
{
t.elems[i] = a.elems[i] * b.elems[i];
}
return t;
}
Array operator /(const Array &a,const Array &b)
{
Array t;
t.elems = new int[a.len];
t.len = a.len;
for(int i=0;i<a.len;i++)
{
t.elems[i] = a.elems[i] / b.elems[i];
}
return t;
}
bool Array:: BorderCheck(int i)const
{
if(i > len)
{
return false; //数组越界
}
else
{
return true;
}
}
int Array:: length() const
{
return len;
}
int & Array:: operator[](int i)
{
if(!BorderCheck(i))
{
cout << "数组越界" << endl;
exit(0);
}
return elems[i];
}
int Array:: operator[](int i)const
{
if(!BorderCheck(i))
{
cout << "数组越界" << endl;
exit(0);
}
return elems[i];
}
const Array& Array:: operator = (const Array&a)
{
if(&a!=this)
{
delete [] elems;
len = a.len;
elems = new int [a.len];
assert(a.elems!=0); //检查elems是否为空指针
for (int i=0;i<a.length();i++)
{
elems[i] = a.elems [i];
}
}
return *this;
}
int main()
{
int arr[] = {1,2,3,4,5};
Array a(arr,5),b,c; //创建Array实例a,b,c,并将arr数组元素置入a中
/* 测试置入是否成功 */
cout << "输出数组a中的元素: ";
for(int i=0;i<a.length();i++)
{
cout << a[i] << " " ;
}
cout << endl;cout << endl;
/* 判断ab是否相等 */
if(a!=b)
{
cout << "数组a和数组b不相等! " << endl;cout << endl;
}
/* 实现b = a 赋值 */
b = a;
cout << "将数组a赋值给数组b后,输出数组b中的元素: ";
for(int i=0;i<b.length();i++)
{
cout << b[i] << " " ;
}
cout << endl;cout << endl;
/* 实现a+b */
c = a+b;
cout << "输出执行a*b后的结果: " ;
for(int i=0;i<c.length();i++)
{
cout << c[i] << " " ;
}
cout << endl;cout << endl;
/* 测试[]重载 */
cout << "数组b中第3个元素是: " << a[2] << endl;cout << endl;
cout << "输出a[7]: " ;
cout << a[7] << endl;
return 0;
}2.实验结果
五、实验心得体会
在进行运算符重载时遇到困难,感受到自己基础知识还有欠缺,在重新申请内存、int & operator[](int i)中&作用上自己欠缺明显。
在本实验中,我初步掌握了C++的编程规则。初次运用C++解决问题还是遇到了很多的问题,有很多细节的地方注意不到而造成了大量的错误。
通过最后本次实验在一定程度上提高了自己的编程能力。