见代码的注释
#include <iostream>
using namespace std;
class Array{
int size;
int *ptr;
public:
Array(int len=0);
Array(Array & a);
~Array();
void push_back(int v);
Array & operator=(const Array & a);
int length(){return size;};
int & operator[](int i);
};
int & Array::operator[](int i){
//能实现a[i]=4, n=a[i]这类的目的
return ptr[i];
}
Array::Array(int s):size(s){
if (s==0)
ptr = NULL;
else
ptr = new int[s];
}
Array::Array(Array & a){
if(!a.ptr){
ptr = NULL;
size = 0;
return;
}
ptr = new int[a.size];
memcpy(ptr, a.ptr, sizeof(int)*a.size); //内容拷贝
size = a.size;
}
Array::~Array(){
if(ptr)
delete [] ptr;
}
//c++赋值号的惯例, 返回赋值号左边对象的引用
Array & Array::operator=(const Array & a){
if(ptr == a.ptr) //防止a=a的赋值
return * this;
if(a.ptr == NULL){
if (ptr)
delete [] ptr;
ptr = NULL;
size = 0;
return *this;
}
if (size < a.size) //原有空间足够大,不必分配新的空间
{
if(ptr)
delete [] ptr;
ptr = new int[a.size];
}
memcpy(ptr, a.ptr, sizeof(int)*a.size);
size = a.size;
return * this;
}
void Array::push_back(int i){
if(ptr){
int * tmpPtr = new int[size+1];
memcpy(tmpPtr, ptr, sizeof(int)*size);
delete[] ptr;
ptr = tmpPtr;
}
else{
ptr = new int[1];
ptr[size++] = i;
}
}
int main(){
Array a;
for (int i=0;i<5;i++){
a.push_back(i); //动态分配
}
Array a1, a2;
a1 = a; //重载赋值符号
for (int i=0; i<a1.length(); i++){
cout << a1[i] <<endl; //a2是一个对象,要重载中括号
}
a1 = a2;
for (int i=0; i<a1.length(); i++){
cout << a1[i] <<endl;
}
a[3] = 100;
Array a4(a); //复制构造函数
for (int i=0; i<a4.length(); i++){
cout << a1[i] <<endl;
}
}