#include<iostream>
using namespace std; template<class T>
class MyArray
{
public:
//构造函数
MyArray<T>(int capacity) {
this->setmCapacity(capacity);
//this->mCapacity = capacity mCapacity是public才这样用
this->mSize = 0;
//申请内存
this->pAddr = new T[this->mCapacity];
} //拷贝,const保证不改变原来的 MyArray
MyArray<T>(const MyArray<T>& 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];
}
} //重载 [] 运算符
T& operator[](int index) {
return this->pAddr[index];
} //重载 = 运算符
MyArray<T>& operator=(const MyArray<T>& arr) { if (this->pAddr != NULL) {
delete[] this->pAddr;
}
this->mSize = arr.mSize;
this->mCapacity = arr.mCapacity;
//申请内存空间
this->pAddr = new T[this->mCapacity];
//数据拷贝
for (int i = 0; i < this->mSize; i++) {
this->pAddr[i] = arr.pAddr[i];
}
return *this;
} //添加元素
void PushBack(T& data) {
//判断容器中是否有位置
if (this->mSize >= this->mCapacity) {
return;
} //调用拷贝构造 =号操作符
//1. 对象元素必须能够被拷贝
//2. 容器都是值寓意,而非引用寓意 向容器中放入元素,都是放入的元素的拷贝份
//3 如果元素的成员有指针,注意深拷贝和浅拷贝问题
this->pAddr[this->mSize] = data;
//msize++
this->mSize++;
} /*
定义第二个pushback()函数的意义在于可以直接传入数据,例如
arr.pushback(50);
左值表示可以在多行使用的值
右值一般表示临时变量,只能在当前行使用
这里的50是一个右值
两个&&表示对右值取引用
*/ void PushBack(T&& data) {
//判断容器中是否有位置
if (this->mSize >= this->mCapacity) {
return;
}
this->pAddr[this->mSize] = data;
//msize++
this->mSize++;
} /*
mCapacity是private
*/
int getmCapacity(int capacity) {
return this->mCapacity;
}
void setmCapacity(int capacity) {
this->mCapacity=capacity;
} //析构函数
~MyArray() {
if (this->pAddr != NULL) {
delete[] this->pAddr;
}
}
public:
//当前数组有多少元素
int mSize;
//保存数据的首地址
T* pAddr; private:
//一共可以容下多少个元素
int mCapacity;
}; void 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); //不能对右值取引用
//左值 可以在多行使用
//临时变量 只能当前行使用
marray.PushBack(100);
marray.PushBack(200);
marray.PushBack(300); for (int i = 0; i < marray.mSize; i++) {
cout << marray[i] << " ";
}
cout << endl;
} class Person {};
void test02() {
Person p1, p2;
MyArray<Person> arr(10);
arr.PushBack(p1);
arr.PushBack(p2);
} int main()
{
test01();
test02();
return 0;
}

MyArray框架搭建与实现的更多相关文章

  1. Angular企业级开发(5)-项目框架搭建

    1.AngularJS Seed项目目录结构 AngularJS官方网站提供了一个angular-phonecat项目,另外一个就是Angular-Seed项目.所以大多数团队会基于Angular-S ...

  2. 一步一步使用ABP框架搭建正式项目系列教程之本地化详解

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 本篇目录 扯扯本地化 ABP中的本地化 小结 扯扯本地化 本节来说说本地化,也有叫国际化.全球化的,不管怎么个叫法,反正道理都是一 ...

  3. ABP框架搭建项目系列教程基础版完结篇

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 经过前面十二篇的基础教程,现在终于该做个总结了. 回顾 第一篇,我们建议新手朋友们先通过ABP官网的启动模板生成解决方案,因为这样 ...

  4. 【Java EE 学习 69 中】【数据采集系统第一天】【SSH框架搭建】

    经过23天的艰苦斗争,终于搞定了数据采集系统~徐培成老师很厉害啊,明明只是用了10天就搞定的项目我却做了23天,还是模仿的...呵呵,算了,总之最后总算是完成了,现在该好好整理该项目了. 第一天的内容 ...

  5. SSH(Struts2+Spring+Hibernate)框架搭建流程<注解的方式创建Bean>

    此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblo ...

  6. 原创:Equinox OSGi应用嵌入Jersey框架搭建REST服务

    一.环境 eclipse版本:eclipse-luna 4.4 jre版本:1.8 二.Equinox OSGi应用嵌入Jersey框架搭建REST服务 1.新建插件工程HelloWebOSGI a. ...

  7. 关于使用ABP框架搭建的项目升级时需要注意的问题汇总

    ABP理论学习总目录 一步一步使用ABP框架搭建正式项目系列教程 ABP之Module-Zero学习目录 本篇目录 说明 升级方法 问题_01:Log4Net导致编译不成功 2015/12/18更新 ...

  8. ssh框架搭建的基本步骤(以及各部分作用)

    ssh框架搭建的基本步骤(以及各部分作用)     一.首先,明确spring,struts,hibernate在环境中各自的作用.   struts: 用来响应用户的action,对应到相应的类进行 ...

  9. 淘宝(阿里百川)手机客户端开发日记第一篇 android 主框架搭建(一)

    android 主框架搭建(一) 1.开发环境:Android Studio 相继点击下一步,直接项目建立完毕(如下图) 图片看的效果如果很小,请放大您的浏览器显示百分比  转载请注明http://w ...

随机推荐

  1. moviepy音视频剪辑:视频变换处理与内容相关的变换函数headblur、mask_and/or、mirror_x/y、rotate、painting、scroll介绍

    一.引言 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>介绍了剪辑基类的fl.fl_time.fx方法,在<moviepy音视频剪辑:视频剪辑基类VideoC ...

  2. PyQt学习随笔:Model/View中TableView视图数据项编辑结果及视图数据项的访问

    按照<PyQt学习随笔:Model/View中设置视图数据项可编辑的方法>的方法支持视图数据可编辑后,编辑后的数据无需主动保存,PyQt会自动将界面变更的数据保存到对应的Model存储中, ...

  3. Python(Python+Qt)学习随笔:使用xlwings新建Execl文件和sheet的方法

    在<Python学习随笔:使用xlwings读取和操作Execl文件>介绍了使用xlwings读取和操作Execl文件的方法,但老猿这两天写个例子使用时,发现使用该文的方法无法新建EXCE ...

  4. java课后作业2019.11.04

    一.编写一个程序,指定一个文件夹,能够自动计算出其总容量 1.代码 package HomeWork; import java.io.File; public class getFileDaxiao ...

  5. 降本增效利器!趣头条Spark Remote Shuffle Service最佳实践

    王振华,趣头条大数据总监,趣头条大数据负责人 曹佳清,趣头条大数据离线团队高级研发工程师,曾就职于饿了么大数据INF团队负责存储层和计算层组件研发,目前负责趣头条大数据计算层组件Spark的建设 范振 ...

  6. (8)ASP.NET Core3.1 Ocelot Consul服务注册与发现

    1.服务注册与发现(Service Discovery) ●服务注册:我们通过在每个服务实例写入注册代码,实例在启动的时候会先去注册中心(例如Consul.ZooKeeper.etcd.Eureka) ...

  7. 手把手教你写DI_3_小白徒手支持 `Singleton` 和 `Scoped` 生命周期

    手把手教你写DI_3_小白徒手支持 Singleton 和 Scoped 生命周期 在上一节:手把手教你写DI_2_小白徒手撸构造函数注入 浑身绷带的小白同学:我们继续开展我们的工作,大家都知道 Si ...

  8. Windows的API功能查询

    在逆向分析时,一些Windows的API函数往往是我们的突破口.但这些函数很难记得一清二楚,以下是我的查找办法,做个小结. 官网 https://docs.microsoft.com/en-us/wi ...

  9. 深入理解Java虚拟机(八)——类加载机制

    是什么是类加载机制 Java虚拟机将class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程就是类加载机制. 类的生命周期 一个类从加载到内存 ...

  10. Day9 python高级特性-- 列表生成式 List Comprehensions

    Python内置的非常简单却强大的可以用来创建list的生成式.    私理解为,就是for循环出来的结果搞成个list~~~~    要生成顺序增量list可以使用list(range(x,y))来 ...