//
// main.cpp
// 创建动态数组
//
// Created by MENGCHEN on 16/1/19.
// Copyright © 2016年 MENGCHEN. All rights reserved.
//
#include <iostream>
class CArray {
int size;
int *ptr;
public:
CArray(int s = 0);
CArray(CArray & a);
~CArray();
void push_back(int v);
CArray& operator=(const CArray & a);
int&operator[](int i);
int length(){return size;}
};
int& CArray::operator[](int i)//返回值是 int 不行!不支持 a[i] = 4
{ //用以支持根据下标访问数组元素
//如n = a[i] 和 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) {
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) {
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){
//比较低效的方法,因为每加入一个元素都会分配一次存储空间,
//高效的做法:预先分配32(或者一个数量)的运算符,当满了之后,再按倍数扩大,这样就不会每次插入的时候都会分配存储空间。
if (ptr) {
int *tmpPtr = new int[size+1];
memcpy(tmpPtr, ptr, sizeof(int)*(size+1));
delete [] ptr;
ptr = tmpPtr;
}else{
ptr = new int[1];
}
ptr[size++] = v;
}
int main(int argc, const char * argv[]) {
// insert code here...
std::cout << "Hello, World!\n";
return 0;
}