16.定义一维数组类 Array,成员数组使用动态内存。重载自增和自减运算符(前置、后置)实现数组元素的自增和自减。具体要求如下:
1.私有数据成员:
- int *p;表示一维数组
- int n;一维数组的大小
2.公有成员函数:
- 构造函数:初始化数据成员;
- 拷贝构造函数
- 重载前置自增的成员函数;
- 重载后置自增的成员函数;
- 重载前置自减的友元函数;
- 重载后置自减的友元函数;
- void print():输出数组成员的函数;
- 析构函数:释放动态内存;
- 若有必要可增加其它成员函数。
3.以数组“{1,2,3,4,5,6,7}”对所定义的类进行测试,要求输出数组元素的自增和自减(前置、后置)情况。
(例如自增则输出:2 3 4 5 6 7 8)
#include <iostream>
using namespace std;
class Array
{
int *p, n;
public:
Array(){
p=0;
n=0;
}
Array(int *a,int len){
n=len;
p=new int[n];
for(int i=0;i<n;i++)p[i]=a[i];
}
Array(Array &array){
n=array.n;
p=new int[n];
for(int i=0;i<n;i++)p[i]=array.p[i];
}
Array &operator++(){
for (int i=0; i<n;i++)p[i]++;
return *this;
}
Array &operator++(int)//这里如果加&表示返回的是地址
{
static Array a=*this;//这里一定要加static!不然返回的就是局部对象的引用
//千万不要返回局部对象的引用!当函数执行完毕时,分配给局部对象的存储空间会释放。此时对局部对象的引用就会指向不确定的内存!某些编译器就会报错
for (int i=0; i<n; i++)p[i]++;
return a;
}
friend Array &operator--(Array &a1){
for (int i=0; i<a1.n; i++)a1.p[i]--;
return a1;
}
friend Array &operator--(Array &a1, int){
static Array a2=a1;
for (int i=0;i<a1.n;i++)
a1.p[i]--;
return a2;
}
Array &operator=(const Array &a)
{
if (a.p){
n=a.n;
p=new int[n];
for (int i=0; i<n; i++)p[i]=a.p[i];
}else p=0;
return *this;
}
void print()
{
for (int i=0; i<n; i++)cout<<p[i]<<' ';
cout<<endl;
}
~Array()
{
if(p)delete[] p;
}
};
int main()
{
int a[7] = {1, 2, 3, 4, 5, 6, 7};
Array arr(a, 7);
arr.print();
Array arr1, arr2, arr3, arr4;
arr1 = arr++;
arr1.print();
arr2 = ++arr;
arr2.print();
arr3 = arr--;
arr3.print();
arr4 = --arr;
arr4.print();
return 0;
}