MyArray.h
#pragma once #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; //int 类型的数组类 class MyArray { public: friend ostream& operator<<(ostream &out,MyArray &myarray);//友元函数声明 friend istream& operator>>(istream &in,MyArray &myarray);//友元函数声明 MyArray(); MyArray(int len); MyArray(const MyArray &another); ~MyArray(); void setData(int index,int value); int getData(int index); int getLen(); int& operator[](int index);//为了可以当左值返回引用 MyArray& operator=(MyArray &another); bool operator==(const MyArray &another); bool operator!=(const MyArray &another); private: int len; //这个连续数组空间目前能够存放的元素个数 int *space; //space 在堆上开辟连续数组空间的首地址 };
MyArray.cpp
#include "MyArray.h" #include <iostream> MyArray::MyArray() { this->space=NULL; this->len=0; } MyArray::MyArray(int len) { if (len<=0) { this->len=0; return; } else { this->len=len; //给space 开辟内存 this->space=new int[this->len]; } } MyArray::MyArray(const MyArray &another) { if (another.len>=0) { this->len=another.len; //深拷贝 this->space=new int[this->len]; for (int i=0;i<this->len;i++) { this->space[i]=another.space[i]; } } } MyArray::~MyArray() { //目的是释放 array 额外开辟的space空间 if (this->space!=NULL) { delete[] this->space; this->len=0; this->space=NULL; } } void MyArray::setData(int index,int value)//这里可能会越界 { this->space[index]=value; } int MyArray::getData(int index) { return this->space[index]; } int MyArray::getLen() { return this->len; } int& MyArray::operator[](int index) { return this->space[index]; } MyArray& MyArray::operator=(MyArray &another) { if(this->space!=NULL)//释放旧的内存 { delete[] space; len=0; } //根据another的大小重新分配内存 this->len=another.len; this->space=new int[this->len]; //拷贝数据 for(int i=0;i<len;i++) { this->space[i]=another.space[i]; } return *this; } bool MyArray::operator==(const MyArray &another) { if(this->len!=another.len)//先判断数组的长度 { return false; } for(int i=0;i<this->len;i++) { if(this->space[i]!=another.space[i]) { return false; } } return true; } bool MyArray::operator!=(const MyArray &another) { /*if(this->len!=another.len) { return true; } for(int i=0;i<this->len;i++) { if(this->space[i]!=another.space[i]) { return true; } } return false;*/ return !(*this==another);//利用上一个重载的== } ostream& operator<<(ostream &out,MyArray &myarray) { for(int i=0;i<myarray.len;i++) { out<<myarray.space[i]<<" "; } return out; } istream& operator>>(istream &in,MyArray &myarray) { cout<<"请输入"<<myarray.len<<"个数:"; for(int i=0;i<myarray.len;i++) { cin>>myarray.space[i]; } return in; }
TestMyArray.cpp测试这个数组类
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include "MyArray.h" using namespace std; int main(void) { MyArray array1(10); //给数组赋值 for(int i=0;i<10;i++) { int value=i+10; array1[i]=value; //array1.setData(i,value); } //遍历数组 /*for (int i=0;i<array1.getLen();i++) { //cout<<array1.getData(i)<<" "; }*/ cout<<array1; MyArray array2=array1;//这是初始化 调用的是拷贝构造函数 再次强调构造函数只有初始化的时候调用 MyArray s; s=array1;//这是赋值调用的是=操作符 cout<<endl; //array2[9]=3; for(int i=0;i<10;i++) { //cout<<array2.getData(i)<<" "; cout<<s[i]<<" "; } cout<<endl; if(array1==array2) { cout<<"array1==array2"<<endl; } if(array1!=array2) { cout<<"array1!=array2"<<endl; } cin>>array1; cout<<array1<<endl;; return 0; }