• 模拟标准库vetor类写一个简易的变长整数型数组


    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;
    }
    
  • 相关阅读:
    将结构体存入Access数据库
    得到当前活动窗体的标题
    Scrapy各项命令说明
    session & viewstate
    网页设计中的默认字体样式详解
    ie6中href设为javascript:void(0)页面无法提交
    < ![if IE]> < ![endif]> 条件注释
    编译型与解释型、动态语言与静态语言、强类型语言与弱类型语言的区别
    Web字体的运用与前景
    jQuery和web.py美元符号($)冲突的解决方法
  • 原文地址:https://www.cnblogs.com/lasnitch/p/12764273.html
Copyright © 2020-2023  润新知