资源简介
动态数组(Dynamic Array)是指动态分配的、可以根据需求动态增长占用内存的数组。为了实现一个动态数组类的封装,我们需要考虑几个问题:new/delete的使用、内存分配策略、类的四大函数(构造函数、拷贝构造函数、拷贝赋值运算符、析构函数)、运算符的重载。
DArray类与String类(面试常考)的源码及测试代码下载。
代码片段和文件信息
/*************************************************************************
> File Name: DArray.cpp
> Author: SongLee
> E-mail: lisong.shine@qq.com
> Created Time: 2014年07月28日 星期一 16时11分22秒
> Personal Blog: http://songlee24.github.io
************************************************************************/
#include“DArray.h“
using namespace std;
void DArray::Init()
{
m_Size = 0; // 默认情况下数组不包含元素
m_Max = 1;
m_Data = new double[m_Max];
}
void DArray::Free()
{
delete [] m_Data;
}
bool DArray::InvalidateIndex(int nIndex)
{
if(nIndex>=0 && nIndex return false;
else
return true;
}
// 默认构造函数
DArray::DArray()
{
Init();
}
// 构造函数
DArray::DArray(int nSize double dValue)
{
if(nSize == 0)
Init();
else
{
m_Size = nSize;
m_Max = nSize*2;
m_Data = new double[m_Max];
for(int i=0; i m_Data[i]=dValue;
}
}
// 拷贝构造函数
DArray::DArray(const DArray& arr)
{
m_Size = arr.m_Size; /*复制常规成员*/
m_Max = arr.m_Max;
m_Data = new double[m_Max]; /*复制指针指向的内容*/
memcpy(m_Data arr.m_Data m_Size*sizeof(double));
}
// 拷贝赋值运算符
DArray& DArray::operator=(const DArray& arr)
{
if(this == &arr) /*自赋值*/
return *this;
m_Size = arr.m_Size;
m_Max = arr.m_Max;
/* 先将右侧对象拷贝到临时对象中,然后再销毁左侧对象*/
double *m_Temp = new double[m_Max];
memcpy(m_Temp arr.m_Data m_Size*sizeof(double));
delete [] m_Data;
m_Data = m_Temp;
return *this;
}
// 析构函数
DArray::~DArray()
{
Free();
}
// 打印数组
void DArray::Print()
{
if(m_Size == 0)
{
cout << “Error: The empty array can‘t be Printed.“ << endl;
exit(0);
}
else
{
for(int i=0; i cout << m_Data[i] << “ “;
cout << endl;
}
}
// 获取数组大小
int DArray::GetSize()
{
return m_Size;
}
// 重置数组大小
void DArray::SetSize(int nSize)
{
if(nSize < m_Size) /*截断*/
{
for(int i=nSize; i m_Data[i] = 0;
}
if(m_Size<=nSize && nSize<=m_Max) /*新增元素置0*/
{
for(int i=m_Size; i m_Data[i] = 0;
}
if(nSize > m_Max) /*需要重新分配空间*/
{
m_Max = nSize*2;
double *temp = new double[m_Max];
memcpy(temp m_Data m_Size*sizeof(double));
for(int i=m_Size; i temp[i] = 0;
delete [] m_Data;
m_Data = temp;
}
m_Size = nSize; /*设置数组大小*/
}
// 获取指定位置元素
double DArray::GetAt(int nIndex)
{
if(InvalidateIndex(nIndex))
{
cout << “Error: the index of GetAt is invalid!“ << endl;
exit(0);
}
return m_Data[nIndex];
}
// 设置指定位置元素的值
void DArray::SetAt(int nIndex double dValue)
{
if(InvalidateIndex(nIndex))
{
cout << “Error: the index of SetAt is invalid!“ << endl;
exit(0);
}
else
{
m_Data[nIndex] = dValue;
}
}
// 追加一个新元素到数组末尾
void DArray::PushBack(double dValue)
{
if(m_Size < m_Max)
{
m_Data[m_Size] = dValue;
}
else
{
m_Max = m_Max*2;
double* temp = new double[m_Max];
memcpy(temp m_Data m_Size*sizeof(double));
delete [] m_Data;
m_Data = temp;
m_Data[m_Size] = dValue;
}
++m_Size; /*数组大小加1*/
}
// 从数组中删除一个元素
void DArray::DeleteAt(int nIndex)
{
if(InvalidateIndex(nIndex))
{
cout << “Erro
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2014-07-29 06:53 Dynamic_Array\
目录 0 2014-07-29 09:01 Dynamic_Array\String\
文件 940 2014-07-29 08:40 Dynamic_Array\String\Test.cpp
文件 1228 2014-07-29 08:29 Dynamic_Array\String\String.h
文件 2188 2014-07-29 08:30 Dynamic_Array\String\String.cpp
目录 0 2014-07-29 06:54 Dynamic_Array\DArray\
文件 966 2014-07-28 15:15 Dynamic_Array\DArray\Test.cpp
文件 1742 2014-07-28 13:59 Dynamic_Array\DArray\DArray.h
文件 4389 2014-07-28 17:16 Dynamic_Array\DArray\DArray.cpp
评论
共有 条评论