//
// 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;
}
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。