#include <iostream>
using namespace std;
class Array{
int* data; //数组首地址
int sz; //数组中实际有多少个数据
int m; //数组当前容量
public:
//构造
Array( int x = 10): sz(0), data(0), m(x){
data = new int[m];
}
//析构函数
~Array(){
delete[] data; //释放申请的堆空间
}
//成员中有指针,为深拷贝,重写拷贝构造函数
Array( const Array& a ){
sz = a.sz;
m = a.m;
data = new int[m];
int i = 0;
for(i=0; i<sz; i++){
data[i] = a.data[i];
}
}
//同样原因,赋值函数也要自己写
Array& operator=( const Array& a ){
//1 判断自赋值
if( this == &a ){
return *this; //若是自己赋值给自己,直接返回当前对象
}
//2 释放原空间
delete[] data;
//3 申请新空间,因为大小不一样,所以要先释放,再申请新空间
data = new int[a.m];
//4 拷贝数据
sz = a.sz;
m = a.m;
int i = 0;
for(i=0; i<sz; i++){
data[i] = a.data[i];
}
//5返回当前对象
return *this;
}
//重载输出运算符
friend ostream& operator<<( ostream& o, const Array& a){
int i = 0;
for(i=0; i<a.sz; i++){
cout << a.data[i] << ' ';
}
return o;
}
int& operator[](int index){ //重载 [] 运算符
return data[index]; //返回变量本身
}
void pushback( int x ){
//若空间已满,扩容
if(sz >= m){
m *= 2;
Array tmp = *this; //定义临时对象保存当前对象数据
delete[] data; //释放原空间
data = new int[m]; //申请新空间
*this = tmp; //用保存的数据给当前对象赋值
}
data[sz++] = x;
}
void show(){
cout << "max=" << m << endl;
cout << "sz=" << sz << endl;
}
};
int main(){
Array a;
Array b;
a.pushback(400);
int i=0;
for(i=0; i<10; i++){
a.pushback(i);
}
cout << a << endl;
b = a;
cout << b << endl;
a.show();
cout << a[3] << endl;
return 0;
}