自定义数组类

2023-10-29

在学习c++的过程中,我们经常使用到数组,那怎么去定义一个类去实现数组的功能呢?
我们先列出一些经常对数组进行的一些操作,

1、 创建一个指定容量的数组
2、 用已有的数组初始化另一个数组
3、 用已有的数组给另一个数组赋值
4、 给数组添加元素/给数组元素赋值
5、 获取数组指定元素的值
6、 输入一定数量的值,将值赋给数组
7、 输出数组
……
还有很多,本次只实现以上功能

以下是代码:

1、MyArray.h 文件 :MyArray 类的声明
#pragma once
#include <iostream>
using namespace std;
class MyArray
{
public:
	// 构造函数
	MyArray();
	// 拷贝构造函数
	MyArray(const MyArray&m);
	// 有参构造函数
	MyArray(int len);
	// 析构函数
	~MyArray();
	// 设置值
	void setData(int index, int data);
	// 获取值
	int getData(int index);
	// 获取长度
	int getLen()const;
	// 重载赋值运算符
	MyArray & operator =(const MyArray&);
	// 重载 []
	int & operator [](int i)const;
	// 重载<<
	friend ostream & operator << (ostream & os, const MyArray & ma);
	// 重载>>
	friend istream & operator >> (istream & is, MyArray & ma);
private:
	int len; // 数组长度
	int * space;// 指针 指向堆上的空间
};
2、MyArray.cpp 文件 :MyArray 类的实现
#include "MyArray.h"
// 构造函数
MyArray::MyArray()
{ 
 	this->len = 0; this->space = NULL; 
}
// 拷贝构造函数
MyArray::MyArray(const MyArray&m)
{
	this->len = m.len;
	// 深拷贝
	if (this->space == NULL)
	{
		this->space = new int[this->len];//申请分配新内存
	}
	for (int i = 0; i < this->len; i++)
	{
		this->space[i] = m.space[i];//拷贝值
	}
}
//有参构造函数
MyArray::MyArray(int len)
{
	if (len <= 0) 
	{
	 	this->len = 0; 
	 	return; 
	}
	else
	{
		this->len = len;
		this->space = new int[this->len];
	}
}
// 析构函数
MyArray::~MyArray()
{
	if ((this->space) != NULL)
	{
		delete this->space;
		this->space = NULL;
		len = 0;
	}
}
// 设置值
void MyArray::setData(int index, int data) 
{ 
	if (this->space != NULL) 
	{ 
		this->space[index] = data; 
	}
}
// 获取值
int MyArray::getData(int index) 
{ 
	return this->space[index]; 
};
// 获取长度
int MyArray::getLen()const
{
 	return this->len;
};
// 重载赋值运算符
MyArray&  MyArray::operator =(const MyArray&m)
{
	if (this == &m) 
	{ 
		return *this; 
	}
	
	// 如果数组不为空,清空数组当前内容
	if (this->space != NULL)
	{
		delete[] this->space;
		this->space = NULL;
	}
	// 深拷贝
	this->len = m.len;
	this->space = new int[this->len];
	for (int i = 0; i < this->len; i++)
	{
		this->space[i] = m.space[i];
	}
	return *this;
}
// 重载 []
int & MyArray::operator [](int i)const
{ 
 	return this->space[i]; 
}
// 重载 <<
ostream & operator << (ostream & os, const MyArray & ma)
{
	for (int i = 0; i < ma.getLen(); i++)
	{ 
		os << ma[i] << " "; 
	}
	return os;
}
// 重载 >>
istream & operator >> (istream & is, MyArray & ma)
{
	cout << "请输入 " << ma.getLen() << " 个数" << endl;
	for (int i = 0; i < ma.getLen(); i++)
	{ 
		is >> ma[i]; 
	}
	return is;
}
3、main 方法调用
#include <iostream>
#include "MyArray.h"
using namespace std;
void main() 
{
	MyArray arr1;		// 声明数组
	MyArray arr2(10);	// 声明一个容量为10的数组
	cin >> arr2;		// 用输入值为数组赋值
	cout << "arr2 : " << arr2 << endl;	// 输出数组
	
	MyArray arr3 = arr2;// 用已有的数组初始化另一个数组
	cout << "arr3 : " << arr3 << endl;	// 输出数组

	arr1 = arr2;		// 用已有的数组给另一个数组赋值
	cout <<"arr1 : "<< arr1 << endl;	// 输出数组

	MyArray arr4(5);	// 给数组添加元素/给数组元素赋值
	for (int i = 0; i < 5; i++) { arr4[i] = i + 10; }
	cout << "arr4 : " << arr4 << endl;	// 输出数组

	// 获取数组指定元素的值
	cout << "arr4 [4] = " << arr4[4] << endl;
}
4、运行结果

在这里插入图片描述

以上。
感谢您的浏览

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义数组类 的相关文章

  • 为 DocumentDb 设置自定义 json 转换器

    我正在使用类型化 DocumentQuery 从 Azure DocumentDb 集合中读取文档 from f in client CreateDocumentQuery
  • CMake(Ninja 后端)使用 /MT 编译

    我有一个类似的问题CMake 使用 MT 而不是 MD 进行编译 https stackoverflow com questions 14172856 cmake compile with mt instead of md但有一些差异 我正
  • 每个元素的 asp.net Web 表单自定义错误消息

    我创建了一个 Web 应用程序 表单 以及后端 SQL 插入和查询 目前我正在显示所有用户错误消息 div style padding 1em div
  • 如何以编程方式删除受信任的根证书颁发机构中的证书?

    我需要能够从组织中的每台电脑中删除特定的证书 是的 我可以逐个座位 但我要到周四才能完成 而且我没有人力逐个座位 是否有使用 C 的编程方式来执行此操作 我认为你不需要编写任何 C 看看certmgr exe del http msdn m
  • 我担心我添加了太多接口

    我正在构建我的领域模型并继续重构它 正如我所做的那样 我发现我喜欢接口 因为它允许我根据接口为具体类型创建可重用的方法 控制器 视图 但是 我发现每次向域实体之一添加新属性时 我都会创建一个接口 例如 我有一个会员状态从抽象继承的对象Ent
  • 如何在 Linux 上重新实现(或包装)系统调用函数?

    假设我想完全接管 open 系统调用 也许要包装实际的系统调用并执行一些日志记录 一种方法是使用 LD PRELOAD http scaryreasoner wordpress com 2007 11 17 using ld preload
  • 公交车公共交通算法

    我正在开发一个可以查找公交路线的离线 C 应用程序 我可以提取时间表 巴士 路线数据 我正在寻找适用于基本数据的最简单的解决方案 可以使用什么算法来查找从巴士站 A 到巴士站 B 的路线 是否有适用于 C Java 的开源解决方案 数据库的
  • 大量互斥体对性能的影响

    假设我有一个包含 1 000 000 个元素的数组 以及多个工作线程 每个线程都操作该数组中的数据 工作线程可能会使用新数据更新已填充的元素 但每个操作仅限于单个数组元素 并且独立于任何其他元素的值 使用单个互斥锁来保护整个数组显然会导致高
  • 自己绘制的WPF自定义滑块

    这是我关于堆栈溢出的第一个问题 所以不要踢它 我在尝试创建 Mac 风格的滑块控件时遇到问题 我已经发现这个解决方案 http www codeproject com KB miscctrl MAC Slider aspx我已经在我的解决方
  • X 轴和 Z 轴上的 Quaternion.Slerp,无 Y 轴

    I am trying to rotate the Player about X Y and Z axis The Y axis should not move from last angle Example if I rotate 45
  • ASP.NET - Crystal Report Viewer 打印按钮在 ASP.NET 中不起作用

    我正在使用 Visual Studio 2008 但我遇到了水晶报告问题 当我单击打印按钮时 它会将我带到弹出窗口 但未找到页面 弹出的网址是 http localhost aspnet client System Web 2 0 5072
  • 使用 STL 流时如何格式化我自己的对象?

    我想将我自己的对象输出到 STL 流 但具有自定义格式 我想出了这样的东西 但由于我之前从未使用过 locale 和 imbue 所以我不知道这是否有意义以及如何实现 MyFacet 和operator 所以我的问题是 这是否有意义以及如何
  • MINIX内部碎片2

    我正在用 C 语言编写一些软件 它递归地列出给定目录中的所有文件 现在我需要计算出内部碎片 我花了很长时间研究这个问题 发现 ext2 上的内部碎片只发生在最后一个块中 我知道理论上你应该能够从索引节点号获得第一个和最后一个块地址 但我不知
  • fgets溢出后如何清除输入缓冲区?

    当输入字符串超出其预定义限制时 我遇到了 fgets 的小问题 以下面的例子为例 for index 0 index lt max index printf Enter the d string index 1 if fgets input
  • 在 clang 中向量化函数

    我正在尝试根据此用 clang 对以下函数进行矢量化铿锵参考 http llvm org docs Vectorizers html 它采用字节数组向量并根据以下条件应用掩码this RFC https www rfc editor org
  • 使用未命名命名空间而不是静态命名空间

    我可以假设在未命名命名空间中声明的对象相当于static namespace int x 1 static int x 2 FWIK 在这两种情况下 x将具有静态存储期限和内部链接 声明为的对象的所有规则也是如此static适用于未命名名称
  • Windows Phone 的 JSON 反序列化

    我正在尝试反序列化以下 JSON 但我真的不知道如何使用 JSON net 来完成这项工作 我正在使用 C 和 JSON Net 库 我的 JSON 如下 found 3 bounds 43 54919 172 62148 43 54487
  • 查找数组中的多个索引

    假设我有一个像这样的数组 string fruits watermelon apple apple kiwi pear banana 是否有一个内置函数可以让我查询 apple 的所有索引 例如 fruits FindAllIndex ap
  • C# 多维数组解析

    我有一个多维数组 内容在调试器中看起来像这样 数组设置为 String s new String 6 4 A B Yes C A B Yes C A B No C A B Yes C A B Yes C A B Yes C A B No C
  • 在多线程环境中捕获信号

    我有一个大型程序 需要尽可能具有弹性 并且有大量线程 我需要捕获所有信号SIGBUS SIGSEGV 并在必要时重新初始化有问题的线程 或者禁用该线程以继续减少功能 我的第一个想法是做一个setjump 然后设置信号处理程序 可以记录问题

随机推荐

  • 进程的互斥与同步

    一 进程 线程的背景 引入进程 为了描述和实现多个程序的并发执行 以改善资源利用率即提高系统的吞吐量 引入线程 减少程序并发执行时系统所付出的额外开销 使操作系统具有更好的并发性 二 进程的互斥与同步 注意 同步即协调 采用多道程序技术的操
  • xss.haozi.me靶场详解

    xss haozi me靶场详解 前言 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F 0x10 0x11 0x12 前言 由于
  • sqli-labs靶场challenges第54-75关(超详细)

    目录 第五十四关 单引号闭合 第五十五关 括号闭合 第五十六关 单引号 括号闭合 第五十七关 双引号闭合 第五十八关 单引号闭合报错注入 第五十九关 数字型报错注入 第六十关 双引号 括号闭合 第六十一关 单引号 双括号闭合报错注入 第六十
  • 通过资源本地化技术减少Flink在YARN上的部署时间

    在大数据领域中 Apache Flink是一个流式处理和批处理的开源框架 能够处理高容量和高速度的数据流 在使用Flink时 通常会将其部署在基于YARN Yet Another Resource Negotiator 的集群上 以便充分利
  • win10环境配置jdk8和jdk17切换失效已解决

    配置jdk8环境变量 1 打开环境变量 在系统变量中新建 变量名为JAVA HOME 变量值为jdk8的安装路径D java package jdk8 2 在系统变量中新建 变量名为CLASSPATH 变量值为 JAVA HOME lib
  • 隐私计算和联邦学习发展的举措

    建立大数据隐私计算和联邦学习生态联盟 联邦学习的新商业模式需要一个商业联盟 联盟包含有 N 个实体 加入联盟的实体 可以像朋友圈一样能够利用各自的数据联合建立模型 联邦数据联盟鼓励各方参与 联盟成员一方面进行垂直领域的合作 另一方面 联盟有
  • Centos7安装vmware-tools教程

    一 前言 本教程同样适用Ubuntu系统 虽有些许不同 但总体思路不变 二 安装 1 挂载vmware tools 2 SSH连接Centos虚拟机 ssh root 192 168 2 2 3 创建CD DVD挂载路径 root loca
  • three.js 切割模型动画,并且播放

    因为公司没有人会用blender 所以动画都是用max做的 动画师一般都是会把多个动画做在一个模型上 然后程序中需要使用的话 调用指定的帧数 unity可以把动画切割成animationclip 最近公司使用了需要在three js中添加一
  • Python 高级知识点总结

    Python 高级知识点总结 原文地址 Python 高级知识点总结 一 可迭代对象 迭代器对象和生成器 像list tuple等这些序列是可以使用for in 语句进行遍历输出的 这是为什么呢 这就要需要知道可迭代对象 Iterable
  • 多功能批量剪辑软件一天剪辑1000条原创视频

    下面一个视频用了呆头鹅批量剪辑软件播放量竟然能达到100多万 他是怎么做到的呢 下面我给大家详细的说一下 在短视频平台开展业务 需具备批量制作视频的能力 为了超越同行 需大量更新作品 争取更多曝光 素材准备就绪 导入软件 设置好视频生成数量
  • JS日志输出-console完美封装

    最近在开发一款chrome扩展插件 经常会打印一些调试的日志 然后上生产的时候日志打印的地方总是会有一些漏网之鱼 没有被删掉 控制台还会打印出很多的敏感信息 这是很不合理的 也是不被允许的 鉴于此 对console做了封装 废话不多说 直接
  • 从声通科技的发展来看,AI行业如何回答可持续盈利这一命题?

    AI浪潮下 相关企业头顶新兴技术的光环 脚下是亏损的阴影 尽管业内不同企业身处不同的细分赛道 但是在巨大的成本支出面前 步伐还是有些难迈开 当前 也有一些AI企业希望借助风口在更受投资者关注的舞台施展拳脚 据悉 2023年上半年 赴港IPO
  • JQuery入门

    window jQuery jQuery 选择id用 id div 直接标签名 class 类名 通配符 a div class 多项选择器 div a 空格选择后代 parent gt child 只选择下一层的父子 prev next
  • [计算机网络]简易http server程序

    好久没输出了 知识还是要写下总结才能让思路更加清晰 最近在学习计算机网络相关的知识 来聊聊如何编写一个建议的HTTP服务器 这个http server的实现源代码我放在了我的github上 有兴趣的话可以点击查看哦 HTTP 服务器 HTT
  • QDateEdit设置为空

    背景 使用QT的日期控件 QDateTimeEdit QDateEdit QTimeEdit 时 它们都自带一个默认值 但是在某些情况下 我们不想要这个默认值 通过现有接口没法实现我们的需求 必须通过继承重构的方式实现 参考链接 下面这篇博
  • java 实现DBScan聚类算法

    最近有一个需求 在地图上 将客户按照距离进行聚合 比如 a客户到b客户5km b客户到c客户5km 那么abc就可以聚合成一个集合 首先想到的就是找一个根据坐标来聚合的算法 这里找了一些后来选择了较为简单也符合要求的DBScan聚类算法 它
  • vue处理tabs切换时请求数据不对的应对方法

    vuex 需要处理的请求路径 const whiteUrl api url const cancelAxios state cancelAxiosArr 取消请求token数组 mutations pushAxios state paylo
  • build打包后怎么查看源码 vue_Vue-cli打包后怎么本地查看的操作

    Vue cli打包成dist后默认是必须在http服务器环境下才能正常运行 可以在本地启动一个http server服务查看 操作步骤如下 全局安装http server npm install g http server 进入dist根目
  • 数据结构与算法之二叉树: Leetcode 98. 验证二叉搜索树 (Typescript版)

    验证二叉搜索树 https leetcode cn problems validate binary search tree 描述 给你一个二叉树的根节点 root 判断其是否是一个有效的二叉搜索树 有效 二叉搜索树定义如下 节点的左子树只
  • 自定义数组类

    在学习c 的过程中 我们经常使用到数组 那怎么去定义一个类去实现数组的功能呢 我们先列出一些经常对数组进行的一些操作 1 创建一个指定容量的数组 2 用已有的数组初始化另一个数组 3 用已有的数组给另一个数组赋值 4 给数组添加元素 给数组