苏轼《饮湖上初晴后雨二首·其二》
水光潋滟晴方好,山色空蒙雨亦奇。
欲把西湖比西子,淡妆浓抹总相宜
案例要求
实现一个通用的数组类,此类主要管理数组,有如下要求:
- 可以对自定义的数据类型或者内置数据进行存储
- 数组中的数据存储在堆区
- 构造函数中传入数组的容量(给数据开辟了多大的空间)
- 实现拷贝构造函数,实现=的重载,实现数组的赋值
- 实现尾插法和尾删法对数组中的数据增加或删除
- 可以通过下标的方式访问数组元素
- 可以获取数组中元素的个数(元素不一定要占据所有空间)和数组的容量
案例实现分析
需要由类模板实现,类模板实现分析如下(对应以上各条):
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 << "没有元素可以删除了" <&