实现动态数组类的封装

本文详细介绍了如何使用C++实现一个动态数组类(CDArray),包括构造函数、析构函数、成员方法如设置大小、获取元素、插入、删除等操作,以及重载操作符[]和赋值操作符=。示例代码展示了类的使用方法,包括插入、追加、删除等操作,并在main函数中进行了测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

##c++实现动态数组类的封装

  1. 编程规范:参考博文
  2. 代码实现:

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值