c++实现简简简化版的vector

最近终于完成了,用c++实现的一个小小小东西,简简简化版的vector,用了好多类的东西,写完之后感觉之前好多不明白的东西,都有了一些新的理解。
借此机会,我想回顾一些小知识点:

  1. new 和 delete、new[] 和 delete[] 对应使用,链接
  2. 列表初始化 有const时要注意。
  3. 运算符重载
  4. 成员函数重载
  5. push_back().
  6. 引用
  7. 冒号与双冒号

下边就是代码了

/*************************************************************************
    > File Name: change_index.cpp
    > Author: 刘怪怪 
    > Mail: 
    > Created Time: 2017年12月11日 星期一 18时08分17秒
 ************************************************************************/

#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;

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 )  //重载[]  这里要返回引用的目的就是
        {
            return  ptr[i];  
        }
};
CArray::CArray(int s):size(s)  //列表初始化  有const时要注意
{
    if(s==0)
        ptr = NULL;
    else
        ptr = new int[s];
}
CArray::CArray(CArray &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;
}
//析构函数
CArray::~CArray()
{
    if(ptr) delete[] ptr;
}
CArray &  CArray::operator = (const CArray &a)
{//赋值号的作用是使“=”左边对象里存放的数组,大小和内容都和右边的对象都一样
    if(ptr==a.ptr)
        return *this;
    if(a.ptr==NULL){//如果a里数组为空
        if(ptr) 
            delete []ptr;     //new 和 delete、new[] 和 delete[] 对应使用。
        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);    //cstring 头文件
    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 ()
{
    CArray a;
    for(int  i=0;i< 5;i++)
        a.push_back(i);      //动态来分配内存存放数组元素 需要一个指针成员变量
    CArray a2,a3;
    a2 = a; // =  要重载
    for (int i=0;i<a2.length();i++)
        cout<<a2[i] << " ";   // []要重载
    cout << endl;
    a[3] =100;
    CArray a4(a);    //() 要重载   要自己写复制构造函数 
    for (int  i=0; i<a4.length();i++)
        cout<< a4[i]<< " ";
    cout << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/holy_666/article/details/78790462