课外闲谈8.通用数据类的案例

简介: 课外闲谈8.通用数据类的案例

前面学了那么多东西,现在我们来一个案例,为什么要专门拿出来讲呢?


因为我到时候准备专门出一期关于这个题目的视频,倒不是因为这个题难,主要是涉及的东西多,一些细节也比较多,下面是关于类的要求。


cdb93c10bf48402bb0820b469a6825ae.png


#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<iostream>
using namespace std;
#include<string>
template<class T>
class MyArray {
private:
  T m_Capacity;//数组容量
  T m_Size;//数组现有大小
  T* pAddress;//数组地址
public:
  //构造函数 
  MyArray(int capacity) {
    m_Capacity = capacity;
    m_Size = 0;
    pAddress = new T[this->m_Capacity];
  }
  //拷贝构造函数
  //arr是一个已存的对象,而this指向的对象才是一个新的,所以需要重新开辟一块堆区空间
  MyArray(const MyArray& arr) {
    //浅拷贝
    this->m_Capacity = arr.m_Capacity;
    this->m_Size = arr.m_Size;
    //深拷贝
    //先让指针指向一块新开辟的堆区空间
    this->pAddress = new T[this.m_Capacity];
    //关于地址的深拷贝,并没有将地址给新对象,而是选择浅拷贝给到
    for (int i = 0; i < arr.m_Size; i++) {
      this->pAddress[i] = arr.pAddress[i];
    }
  }
  //重载=运算符,防止浅拷贝问题
  MyArray& operator=(const MyArray& myarray) {
    //先将对象中的数据彻底删除,然后再放入数据
    //因为,=两边的数据类型大小未知,若大小不同,就不能准确的覆盖完全
    //可能产生一些未知的后果
    if (this->pAddress != NULL) {
      delete[] this->pAddress;
      this->pAddress = NULL;
      this->m_Capacity = 0;
      this->m_Size = 0;
    }
    this->m_Capacity = myarray.m_Capacity;
    this->m_Size = myarray.m_Size;
    this->pAddress = new T[this->m_Capacity];
    for (int i = 0; i < myarray.m_Size; i++) {
      this->pAddress[i] = myarray[i];
    }
    //记得返回本身,即函数返回值返回引用,这样就可以做左值
    return *this;
  }
  //用下标去访问数组元素,重载【】运算符;因为【】前面时对象,不是数组名
  T& operator[](int index) {
    return this->pAddress[index];
  }
  //尾插法
  void push_back(const T& val) {
    if (this->m_Capacity == this->m_Size) {
      cout << "满了" << endl;
      return;
    }
    //这里的【】里面只用写this->m_Size,因为数组从零开始存储
    //this->m_Size是从零开始加的;
    this->pAddress[this->m_Size] = val;
    this->m_Size++;
  }
  //尾删法
  //在前面的时候,如果要删除数组中的某个元素,都是选择直接让数组元素前移
  //然后再将总体长度减小就行,
  //这里就是一种比较特殊的情况了,要删除的元素是最后一个,不需要前移
  //任何元素,只需将总长度减一即可;
  void pop_back() {
    if (this->m_Size == 0) {
      return;
    }
    this->m_Size--;
  }
  //获取数组容量
  int getlong() {
    return this->m_Capacity;
  }
  //获取数组大小
  int getsize() {
    return this->m_Size;
  }
  //析构函数
  ~MyArray() {
    if (this->pAddress != NULL) {
      delete[] this->pAddress;
      this->pAddress = NULL;
      this->m_Capacity = 0;
      this->m_Size = 0;
    }
  }
};


测试的部分就交给大家自己写了,可以期待一下我接下来出的关于这一篇博客的视频,嘿嘿嘿,当然,自己能理解更好。

目录
相关文章
|
存储 安全 编译器
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(下)
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(下)
|
6月前
|
存储 Web App开发 运维
发布、部署,傻傻分不清楚?从概念到实际场景,再到工具应用,一篇文章让你彻底搞清楚
部署和发布是软件工程中经常互换使用的两个术语,甚至感觉是等价的。然而,它们是不同的! • 部署是将软件从一个受控环境转移到另一个受控环境,它的目的是将软件从开发状态转化为生产状态,使得软件可以为用户提供服务。 • 发布是将软件推向用户的过程,应用程序需要多次更新、安全补丁和代码更改,跨平台和环境部署需要对版本进行适当的管理,有一定的计划性和管控因素。
1485 1
|
6月前
|
程序员 Python
类的设计奥秘:从代码到架构的科普全解
类的设计奥秘:从代码到架构的科普全解
95 2
|
6月前
|
Python
继承概念深度解析:代码视角下的科普之旅
继承概念深度解析:代码视角下的科普之旅
31 0
2020考研公共课_基础精讲课_管理类联考综合能力 联考逻辑(读书笔记)
2020考研公共课_基础精讲课_管理类联考综合能力 联考逻辑(读书笔记)
|
安全 Java C++
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(上)
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计
|
编解码 iOS开发
一节微课诞生的全过程(无保留分享,望收藏)
本来是想以直播的方式把制作这节微课的过程分享出来,但考虑到大家的时间不统一,制作过程太长,这节微课录音之后制作动画就足足用了两天
195 0
|
编译器 C++
爱上c++的第三天(核心课程):类和对象--对象特性
初始化数据,主要作用于创建对象时为对象的成员属性赋值,构造函数由系统自动调用,无需手动调用。
92 0
爱上c++的第三天(核心课程):类和对象--对象特性
|
监控 数据可视化 测试技术
软工导第一节课 计算机软件工程学作一个简短的概述,回顾计算机系统发展简史 软件工程的基本原理和方法有概括的本质的认识,详细讲解生命周期相关知识讲解8种典型的软件过程模型
软工导第一节课 计算机软件工程学作一个简短的概述,回顾计算机系统发展简史 软件工程的基本原理和方法有概括的本质的认识,详细讲解生命周期相关知识讲解8种典型的软件过程模型
271 0
软工导第一节课 计算机软件工程学作一个简短的概述,回顾计算机系统发展简史 软件工程的基本原理和方法有概括的本质的认识,详细讲解生命周期相关知识讲解8种典型的软件过程模型