c++标准库中有一个边长数组类vector,为了巩固前面学习的关于运算符重载以及构造函数的知识,在此模拟标准库,自定义一个简易的int型的变长数组类CArray。这个类在效率上存在一定的缺陷,只做学习中。
#include<iostream>
#include<cstring>
using namespace std;
class CArray{
private:
int *ptr;
int size;
public:
CArray(){
ptr = NULL;
size = 0;
}//无参构造函数
void push_back(int v);//向数组末尾追加元素
CArray & operator=( CArray& array1);//实现数组对象深拷贝
int & operator[](int i);//实现通过下标访问数组元素
int length()const{ //通过成员函数访问数组长度
return size;
} //ok
CArray(const CArray & array1);//复制构造函数
~CArray(){ //析构函数,释放动态分配内存
if(ptr){
delete []ptr;
}
}
};
CArray::CArray( const CArray & array1){
if(!(array1.ptr)){//如果用来初始化的对象本身就是空的
(*this).size = 0;
(*this).ptr=NULL;
}else{//如果用来初始化的对象本身不是空的
ptr = new int[array1.size];// 给当前对象分配内存空间,大小与array一样
memcpy(ptr,array1.ptr,sizeof(int)*array1.size);
(*this).size = array1.size;
}
}
CArray & CArray::operator=(CArray& array1){
if(ptr==array1.ptr){//自己之间的赋值,直接返回
return *this;
}
if(ptr!=NULL){//如果左边原本不是空的,先把左边清空
delete []ptr;
ptr=NULL;
size=0;
}
if(array1.ptr==NULL){ //如果右边为空,直接返回
return *this;
}else{//如果右边不为空,将右边对象的数据拷贝到左边对象
ptr = new int[array1.size];//为左边的ptr开辟新的内存空间,大小为array1所指向的大小
memcpy(ptr,array1.ptr,sizeof(int)*array1.size);//将array1.ptr指向的内存空间的 前x 字节拷贝一份到 ptr指向的内存空间中
(*this).size=array1.size;
}
return *this;
}
int& CArray::operator[](int i){
return ptr[i];
}
void CArray::push_back(int push_data){
if(ptr){//str之前就已经指向了数据
int *p = new int[size+1];
memcpy(p,ptr,sizeof(int)*size); //1:指针指向的数组之间的拷贝问题。
delete []ptr; //2:ptr指向的是一个int数组,因此应该释放数组
ptr=p;
}
else{//str 之前指向空
ptr = new int[1]; //这里不能写成new int 因为对应着析构函数,要统一
}
ptr[size++]=push_data; //3:先执行ptr[size]=push_data;再执行size++
}
int main(){
CArray a; //创建一个CArray数组a。 需要定义无参构造函数
for( int i = 0;i < 5;++i)//向元素末尾存放值
a.push_back(i);
CArray a2,a3;//再创建两个CArrary数组a2,a3
cout <<"-------test operator=------"<< endl;
a2 = a; //将数组a赋值给数组a2 测试深拷贝
for( int i = 0; i < a2.length(); ++i ) //遍历数组a2
cout <<a2[i] << " " ;
cout <<endl<<"---------------------------"<< endl;
cout <<endl<<"-------a2输出应该为空------"<< endl;
a2 = a3; //a2是空的程序输出结果是:
for( int i = 0; i < a2.length(); ++i ) //a2.length()返回0
cout << a2[i] << " ";
cout <<endl<<"---------------------------"<< endl;
cout <<endl<<"--- test a[3]=100 a4(a)----"<< endl;
a[3] = 100; //修改 3位置的int数 需要重载[] 使其接收一个int型变量(索引),返回值是该位置的引
CArray a4(a); //在初始化时,用一个对象初始化另外一个对象。 需要定义复制构造函数
for( int i = 0; i < a4.length(); ++i )
cout <<a4[i] << " ";//要做哪些事情?
cout <<endl<<"---------------------------"<< endl;
return 0;
}