C++系列-类模板案例


苏轼《饮湖上初晴后雨二首·其二》
水光潋滟晴方好,山色空蒙雨亦奇。
欲把西湖比西子,淡妆浓抹总相宜


案例要求

实现一个通用的数组类,此类主要管理数组,有如下要求:

  1. 可以对自定义的数据类型或者内置数据进行存储
  2. 数组中的数据存储在堆区
  3. 构造函数中传入数组的容量(给数据开辟了多大的空间)
  4. 实现拷贝构造函数,实现=的重载,实现数组的赋值
  5. 实现尾插法和尾删法对数组中的数据增加或删除
  6. 可以通过下标的方式访问数组元素
  7. 可以获取数组中元素的个数(元素不一定要占据所有空间)和数组的容量

案例实现分析

需要由类模板实现,类模板实现分析如下(对应以上各条):
1,类中主要的成员属性是该数组,数组的容量,数组元素的个数,m_p_array, m_capacity, m_size
其中m_p_array是该数组的首地址,指针类型。m:member,p:pointer
2,存储在堆区,需要在构造函数中使用new方法来开辟空间,同时,析构函数也要自己实现,用于
释放堆区空间。
3,有参构造。
4,拷贝构造应用于使用已有对象来实例化一个新的对象。=重载应用于数组的直接赋值
5,通过写成员函数实现,删除元素时,将m_size减小。增加元素时,m_size增加,并给增加的位置
赋值。
6,数组名[]是可以直接访问数组元素的,但是通过对象名[]访问其中的一个属性(数组)中的元素需
进行运算符重载。
7,成员函数实现。
8,再增加拼接数组的代码。

案例实现

总代码

#include <iostream>    
using namespace std;

class Person
{
   
public:
	string m_name;
	int m_age;
public:
	Person() 
	{
   
		//cout << "Person无参构造" << endl;
	}
	Person(string name, int age)
	{
   
		//cout << "Person有参构造" << endl;
		m_name = name;
		m_age = age;
	}
};

// 创建类模板
template<class T>
class MyArray
{
   
	// 函数模板作为类模板的友元,可以直接把函数的定义部分拷贝进来
	template<class T1>
	friend void print_array(T1 ref_array);
	friend void print_array(MyArray<Person>& ref_array);
private:
	int m_capacity;	// 为数组开辟的内存大小,有些空间不一定有元素
	int m_size;		// 数组中元素的个数
	T *m_p_array;	// 数组的首地址

public:
	MyArray(int capacity)		// 有参构造
	{
   
		//cout << "有参构造调用" << endl;
		m_capacity = capacity;
		m_size = 0;
		m_p_array = new T[m_capacity];
	}
	
	MyArray(const MyArray& ref_array)		// 拷贝构造
	{
   
		//cout << "拷贝构造调用" << endl;
		m_capacity = ref_array.m_capacity;
		m_size = ref_array.m_size;
		m_p_array = new T[ref_array.m_capacity];	// 开辟好内存空间
		// 数组中的元素也进行拷贝
		for (int i_loop = 0; i_loop < ref_array.m_size; i_loop++)
		{
   
			m_p_array[i_loop] = ref_array.m_p_array[i_loop];
		}
	}

	MyArray& operator=(const MyArray& ref_array)	// 实现连等,返回必须是MyArray& 
	{
   
		//cout << "=运算符重载" << endl;
		// 如果赋值目标对象中原来有数据,先都删除掉,包括堆区内存也要释放,然后再赋值
		if (m_p_array != NULL)
		{
   
			delete[] m_p_array;
			m_p_array = NULL;
			m_capacity = 0;
			m_size = 0;
		}
		m_capacity = ref_array.m_capacity;
		m_size = ref_array.m_size;
		m_p_array = new T[ref_array.m_capacity];	// 开辟好内存空间
		for (int i_loop = 0; i_loop < m_size; i_loop++)
		{
   
			m_p_array[i_loop] = ref_array.m_p_array[i_loop];
		}
		return *this;
	}

	T& operator[](int idx)		// 如果要作为左值,返回引用,如a[5]=3;
	{
   
		//cout << "[]运算符重载" << endl;
		return m_p_array[idx];
	}
	
	void append(T append_data)
	{
   
		if (m_size == m_capacity)
		{
   
			cout << "没有空间可以添加元素了" << endl;
			return;
		}
		else
		{
   
			m_p_array[m_size] = append_data;
			m_size += 1;
		}
	}

	void pop()
	{
   
		if (m_size == 0)
		{
   
			cout << "没有元素可以删除了" <&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值