注意

1、右值的拷贝使用

2、拷贝构造函数的使用

#include<iostream>
using namespace std;template<class T>
class MyArray{
public:MyArray(int capacity){this->mCapacity = capacity;this->mSize = 0;//申请内存this->pAddr = new T[this->mCapacity];}//拷贝构造MyArray(const MyArray<T>& arr);  T& operator[](int index);MyArray<T> operator=(const  MyArray<T>& arr);void PushBack(T& data);//&&对右值取引用void PushBack(T&& data);~MyArray() {if (this->pAddr != NULL){delete[] this->pAddr;}}
public:int mCapacity;  //数组容量int mSize;      //当前数组有多少元素T* pAddr;     //保存数组的首地址
};
template<class T>
MyArray<T>::MyArray(const MyArray<T>& arr)
{//我的 将原有数组拷贝到当前数组  错误/*arr->mCapacity = this->mCapacity;arr->mSize = this->mSize;arr->pAddr = new T[this->mCapacity];for (int i = 0; i < mSize; i++){arr->pAddr[i] = this->pAddr[i];}*///将arr拷贝到当前数组this->mCapacity = arr.mCapacity;this->mSize = arr.mSize;//申请内存空间this->pAddr = new T[this->mCapacity];//数据拷贝for (int i = 0; i < this->mSize; i++){this->pAddr[i]=arr.pAddr[i];}
}
template<class T>
T& MyArray<T>::operator[](int index)
{return this->pAddr[index];
}template<class T>
MyArray<T> MyArray<T>::operator=(const MyArray<T>& arr)
{//释放以前空间if (this->pAddr != NULL){delete[] this - < pAddr;}this->mCapacity = arr.mCapacity;this->mSize = arr.mSize;//申请内存空间this->pAddr = new T[this->mCapacity];//数据拷贝for (int i = 0; i < this->mSize; i++){this->pAddr[i] = arr->pAddr[i];}return *this;
}template<class T>
void MyArray<T>::PushBack(T& data)
{//判断容器中是否有位置if (this->mSize >= this->mCapacity){return;}//调用拷贝构造 =号操作符//1、对象元素必须能够被拷贝//2、容器都是值寓意,而非引用寓意  向容器中放入元素都是放入元素的拷贝份//3、如果元素的成员有指针,注意 深拷贝和浅拷贝//深拷贝 拷贝指针 和指针指向的内存空间//浅拷贝 光拷贝指针this->pAddr[this->mSize] = data;mSize++;
}
#if 1
template<class T>
void MyArray<T>::PushBack(T&& data)
{//判断容器中是否有位置if (this->mSize >= this->mCapacity){return;}this->pAddr[this->mSize] = data;mSize++;
}
#endifvoid test01()
{MyArray<int> marray(20);int a = 10,b=20,c=30,d=40;marray.PushBack(a);marray.PushBack(b);marray.PushBack(c);marray.PushBack(d);//错误原因:不能对右值取引用//左值 可以在多行使用//右值 只能在当前行使用 一般为临时变量//增加void PushBack(T&& data)即可不报错marray.PushBack(100);marray.PushBack(200);marray.PushBack(300);for (int i = 0; i < marray.mSize; i++){cout << marray.pAddr[i] << " ";}cout << endl;MyArray<int> marray1(marray);  //拷贝构造函数使用cout << "myarray1:" << endl;for (int i = 0; i < marray1.mSize; i++){cout << marray1.pAddr[i] << " ";}cout << endl;MyArray<int> marray2=marray;  //=操作符的使用cout << "myarray2:" << endl;for (int i = 0; i < marray2.mSize; i++){cout << marray2.pAddr[i] << " ";}cout << endl;}
class Person{};
void test02()
{Person p1, p2;MyArray<Person> arr(10);arr.PushBack(p1);arr.PushBack(p2);}int main()
{test01();system("pause");return 0;
}

运行结果:

STL3-MyArray动态数组类模板实现相关推荐

  1. 第十四周项目三-数组类模板

    /* *Copyright(c)2016,烟台大学计算机与控制工程学院 *All rights reserved *文件名称:123.cpp *作 者:王蕊 *完成日期:2016年6月2日 *版 本 ...

  2. 【C++深度剖析教程39】实现C++数组类模板

    上一篇文章在那个学习了多参数类模板与特化的分析:点击链接查看上一篇文章:类模板深度剖析 本篇文章学习记录: 数值型模板参数 实现C++数组类模板 1.模板中的数值型参数 模板参数可以是数值型参数.也就 ...

  3. 学习笔记 C++ 动态数组类的声明

    学习笔记  C++ 第九章 群体类和群体数据的组织/ 9.2线性群体 C++动态数组类的声明 一  Array<T>& operator= (const Array<T> ...

  4. 爪哇国新游记之十五----泛型动态数组类

    import java.lang.reflect.Array;/*** 泛型动态数组类**/ public class DynamicArray<T extends Object>{pri ...

  5. C++实现数组类模板

    本段代码是根据黑马先生教学的内容手撕出来的.特此感谢黑马先生 内容包含类数组类的设计,其中有构造函数,析构函数,拷贝函数,operator重定义=操作符,以及尾插和尾删法的运用. hpp文件内容 #p ...

  6. 爪哇国新游记之三----自创动态数组类

    package array;public class DArray{private int[] arr;private int currCount;private static final int I ...

  7. 封装动态数组类Array

    功能: 1.增.删.改.查 2.扩容.缩容 3.复杂度分析 4.均摊复杂度 5.复杂度震荡 分析动态数组的时间复杂度: 分析resize的时间复杂度: public class Array<E& ...

  8. android 动态数组类,Android动态数组ListPreference

    rochdev.. 23 将preferences.xml放在res/xml中 android:title="Dynamic categories" android:summary ...

  9. 从零开始实现数据结构(一) 动态数组

    动态数组是所有数据结构中最简单的一种,甚至在很多的语言中,数组本身就是可以不定长的.因为在学习c++的时候,使用动态数组的各种操作都不是很方便(数据结构的学习最好还是c或c++,基础打好了其他的语言数 ...

最新文章

  1. 看源码,我为什么推荐IDEA?
  2. 【Socket网络编程】4.tcp和udp的客户端和服务端收发流程
  3. SAP Control framework
  4. mysql 数值型注入_SQL注入之PHP-MySQL实现手工注入-数字型
  5. 做一个有胆识的有为青年
  6. Matlab英文操作系统下中文乱码的解决方案
  7. ubunt16.04 安装3090显卡驱动 cuda cudnn pytorch
  8. 【2017年第4期】大数据标准体系
  9. 数据搬运组件:基于Sqoop管理数据导入和导出
  10. java导出excel_Hutool Java 工具类库导出 Excel,超级简单!
  11. python多分类_python中多类分类的ROC或CAP曲线
  12. python3 之 天天生鲜 项目 缓存cache
  13. Linux内核调度——《奔跑吧Linux内核》学习笔记
  14. 12.TCP/IP 详解卷1 --- 广播和多播
  15. CentOS下安装配置MySQL8.0的步骤详解
  16. 诺顿误杀真相之“为什么诺顿会误杀中文windows”
  17. 常用音频单位简介:dBSPL、dBm、dBu、dBV、dBFS
  18. Linux 下安装和配置 MinDoc
  19. 重磅!中国芯片新锐50强榜单发布,上海20家、北京仅4家!(附:详细解读)...
  20. 2021-08-30-全排列-逆序数-排列的奇偶性

热门文章

  1. idea中svn的更新、检出、提交操作
  2. extjs 渲染之前的方法_Unity通用渲染管线(URP)系列(十一)——后处理(Bloom)...
  3. 安卓手机小说阅读器_乐小说阅读器下载手机版-乐小说阅读器app下载安装
  4. swagger2maven依赖_Maven + SpringMVC项目集成Swagger
  5. java 俄罗斯方块窗口_[代码全屏查看]-java 俄罗斯方块
  6. Android坑点-ByteBuffer.array() 入过坑吗
  7. Graphicsmagick linux 中文水印乱码-new
  8. ZXing生成二维码
  9. LeetCode算法入门- Palindrome Number-day2
  10. openstack资源使用汇总_关于OpenStack的学习路线及相关资源汇总