##c++实现动态数组类的封装
- 编程规范:参考博文
- 代码实现:
DynamicArray.h
class CDArray
{
private:
double* m_pData; // 存放数组的动态内存指针
int m_nSize; // 数组的元素个数
private:
void Init(); // 初始化
void Free(); // 释放动态内存
inline int InvalidateIndex(int nIndex); // 判断下标的合法性
public:
CDArray(); // 缺省构造函数
CDArray(int nSize, double dValue = 0); // 其他构造函数,设置一定数组大小,并设置所有元素为0;当然还可以定义其他不同参数的构造函数,以方便用户使用
CDArray(const CDArray& arr); // 拷贝构造函数(最好为所有包含动态分配成员的类都提供拷贝构造函数)
~CDArray(); // 析构函数
void Print(); // 输出显示所有数组元素的值
int GetSize(); // 获取数组大小(元素个数)
int SetSize(int nSize); // 重新设置数组的大小。注:若nSize小于原数组大小,可截断取前nSize个元素作为新数组的元素;若nSize大于原数组大小,新增的元素的值设置缺省值0即可
double GetAt(int nIndex); // 获取某个元素
double operator[] (int nIndex) const; // 重载[]操作符,以便像传统数组那样通过a[k]来获取元素值
int SetAt(int nIndex, double dValue); // 设置某个元素的值
int PushBack(double dValue); // 追加一个新的元素到数组末尾
int DeleteAt(int nIndex); // 从数组中删除一个元素
int InsertAt(int nIndex, double dValue); // 插入一个新的元素到数组中
CDArray& operator = (const CDArray& array); // 重载赋值操作符号"="
};
DynamicArray.cpp
/*
*******
现在要求动态数组的类的接口如下:
class CDArray
{
private:
double *m_pData; // 存放数组的动态内存指针
int m_nSize; // 数组的元素个数
private:
void Init(); // 初始化
void Free(); // 释放动态内存
inline int InvalidateIndex(int nIndex); // 判断下标的合法性
public:
CDArray(); // 缺省构造函数
CDArray(int nSize, double dValue = 0); // 其他构造函数,设置一定数组大小,并设置所有元素为0;当然还可以定义其他不同参数的构造函数,以方便用户使用
CDArray(const DArray& arr); // 拷贝构造函数(最好为所有包含动态分配成员的类都提供拷贝构造函数)
~CDArray(); // 析构函数
void Print(); // 输出显示所有数组元素的值
int GetSize(); // 获取数组大小(元素个数)
int SetSize(int nSize); // 重新设置数组的大小。注:若nSize小于原数组大小,可截断取前nSize个元素作为新数组的元素;若nSize大于原数组大小,新增的元素的值设置缺省值0即可
double GetAt(int nIndex); // 获取某个元素
double operator[] (int nIndex) const; // 重载[]操作符,以便像传统数组那样通过a[k]来获取元素值
int SetAt(int nIndex, double dValue); // 设置某个元素的值
int PushBack(double dValue); // 追加一个新的元素到数组末尾
int DeleteAt(int nIndex); // 从数组中删除一个元素
int InsertAt(int nIndex, double dValue); // 插入一个新的元素到数组中
CDArray &CDArray::operator = (const CDArray& array); // 重载赋值操作符号"="
};
其他:
#define SAFEDELETE(p) if(p) {delete p; p=NULL;}
#define SAFEDELETES(p) if(p) {delete [] p; p=NULL;}
*******
*/
#include<cstring>
#include<iostream>
#include<iomanip>
#include "DynamicArray.h"
using namespace std;
void CDArray::Init() {
m_nSize = 0;
m_pData = new double[m_nSize];
}
void CDArray::Free() {
delete[]m_pData;
}
int CDArray::InvalidateIndex(int nIndex) {
if (nIndex >= 0 && nIndex < m_nSize)
return 0;
else
return 1;
}
//默认构造函数
CDArray::CDArray() {
Init();
}
CDArray::CDArray(int nSize, double dValue) {
if (nSize == 0)
Init();
else {
m_nSize = nSize;
m_pData = new double[m_nSize];
for (int i = 0; i < nSize; i++) {
m_pData[i] = dValue;
}
}
}
CDArray::CDArray(const CDArray& arr) {
m_nSize = arr.m_nSize;
m_pData = new double[m_nSize];
memcpy(m_pData, arr.m_pData, m_nSize * sizeof(double));
}
CDArray::~CDArray() {
Free();
}
void CDArray::Print() {
if (m_nSize == 0) {
cout << "Error:The array is empty" << endl;
//exit(0);
}
else {
for (int i = 0; i < m_nSize; i++) {
cout <<setw(8)<<m_pData[i];
}
cout << endl;
}
}
int CDArray::GetSize() {
return m_nSize;
}
int CDArray::SetSize(int nSize) {
if (nSize < m_nSize) {
for (int i = nSize; i < m_nSize; i++)
m_pData[i] = 0;
}
//新增元素置0
if (nSize >= m_nSize) {
double* temp = new double[nSize];
memcpy(temp, m_pData, m_nSize * sizeof(double));
delete[]m_pData;
m_pData = temp;
for (int i = m_nSize; i < nSize; i++)
m_pData[i] = 0;
}
m_nSize = nSize;
return 1;
}
// 获取某个元素
double CDArray::GetAt(int nIndex) {
if (InvalidateIndex(nIndex)) {
cout << "Error:: The index of GetAt is invalid! " << endl;
exit(0);
}
return m_pData[nIndex];
}
// 重载[]操作符,以便像传统数组那样通过a[k]来获取元素值
double CDArray::operator[] (int nIndex) const {
if (nIndex < 0 || nIndex >= m_nSize) {
cout << "Error:: The index is invalid! " << endl;
exit(0);
}
return m_pData[nIndex];
}
// 设置某个元素的值
int CDArray::SetAt(int nIndex, double dValue) {
if (nIndex < 0 || nIndex >= m_nSize) {
cout << "Error:: The index is invalid! " << endl;
return 0;
exit(0);
}
else {
m_pData[nIndex] = dValue;
return 1;
}
}
// 追加一个新的元素到数组末尾
int CDArray::PushBack(double dValue) {
double* temp = new double[m_nSize + 1];
memcpy(temp, m_pData, m_nSize * sizeof(double));
delete[]m_pData;
m_pData = temp;
m_pData[m_nSize] = dValue;
++m_nSize;
return 1;
}
// 从数组中删除一个元素
int CDArray::DeleteAt(int nIndex) {
if (InvalidateIndex(nIndex)) {
cout << "Error:: The index is invalid! " << endl;
return 0;
exit(0);
}
else {
for (int i = nIndex; i < m_nSize; i++) {
m_pData[i] = m_pData[i + 1];
}
m_pData[m_nSize - 1] = 0;
--m_nSize;
}
return 1;
}
// 插入一个新的元素到数组中
int CDArray::InsertAt(int nIndex, double dValue) {
if (nIndex<0||nIndex>m_nSize) {
cout << "Error:: The index is invalid! " << endl;
return 0;
exit(0);
}
else {
double* temp = new double[m_nSize + 1];
memcpy(temp, m_pData, m_nSize * sizeof(double));
delete[]m_pData;
m_pData = temp;
for (int i = m_nSize - 1; i >= nIndex; i--) {
m_pData[i + 1] = m_pData[i];
}
m_pData[nIndex] = dValue;
}
++m_nSize;
return 1;
}
// 重载赋值操作符号"="
CDArray & CDArray::operator=(const CDArray & arr) {
if (this == &arr) {
return *this;
}
m_nSize = arr.m_nSize;
double* m_Temp = new double[m_nSize];
memcpy(m_Temp, arr.m_pData, m_nSize * sizeof(double));
delete[]m_pData;
m_pData = m_Temp;
return *this;
}
main.cpp
#include "DynamicArray.h"
int main() {
CDArray a;
a.InsertAt(0, 2.1);
a.Print();
a.PushBack(3.0);
a.PushBack(3.1);
a.PushBack(3.2);
a.Print();
a.DeleteAt(0);
a.Print();
a.InsertAt(0, 4.1);
a.Print();
CDArray acopy = a; //此处用到了拷贝构造函数
acopy.Print();
CDArray acopy2(a); //该语句等同于上面的语句,都是初始化
acopy2.Print();
CDArray acopy3;
acopy3 = a; //此处用到了赋值操作符号"="的重载
acopy3.Print();
CDArray b;
b.PushBack(21);
b.Print();
b.DeleteAt(0);
b.Print();
b.PushBack(22);
b.SetSize(5);
b.Print();
CDArray c;
c.PushBack('a');
c.PushBack('b');
c.PushBack('c');
c.InsertAt(0, 'd');
c.Print();
return 0;
}