运算重载实现可变长数组

来源:互联网 发布:高阶矩阵计算 编辑:程序博客网 时间:2024/05/16 23:45
#include <iostream>
#include<cstring>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
class CArray{
        int size;//数组元素个数
           int *ptr;//指向动态分配的数组
    public:
        CArray(int s = 0);//s代表数组元素个数
        CArray(CArray&a);
        ~CArray();
        void push_back(int v);//用于在数组尾部添加元素v
        CArray& operator=(const CArray&a);
        //用于数组对象间赋值
        int length(){
            return size;
        }    
    int& operator[](int i){
        //实现n=a[i]; a[i]=4;  非引用返回值不能作为左值使用  返回值不是引用 则a[i]=4 不能使用
            return ptr[i];
        }
};
CArray::CArray(int s):size(s)
{
    if(s == 0)
        ptr = NULL;
    else
        ptr = new int[s];
 }
 
 CArray::CArray(CArray &a){
     if(!a.ptr){//a是空数组
         ptr = NULL;
         size = 0;
         return;
     }
     ptr = new int[a.size];
     memcpy(ptr,a.ptr,sizeof(int)*a.size);
     size  = a.size;
 }
 CArray::~CArray()
 {
     if(ptr) delete[] ptr;
 }
 
 CArray& CArray::operator=(const CArray& a)//C++ 赋值号返回的左边的值是引用
 {
     //赋值号的作用是=左边对象里存放的数组 大小和内容和右边 的一样 不能指向同一块空间
     if( ptr== a.ptr )//防止a=a这样的语句导致出错
         return *this;
     if(a.ptr == NULL){//如果a里面数组是空的
         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 CArray::push_back(int v){
     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++]=v;//加入新的数组元素
 }
int main(int argc, char** argv) {
    return 0;
}




















0 0
原创粉丝点击