C++实践参考——数组类运算的实现

【项目-数组类运算的实现】
  设计数组类Array,为了实现测试函数中要求的功能,请补足相关的函数(构造、析构函数)和运算符重载的函数。
  实现策略提示:可以将测试函数中的语句加上注释,取消一句的注释,增加相应的函数,以渐增地实现所有的功能,避免全盘考虑带来的困难。

class Array
{
private:int* list;      //用于存放动态分配的数组内存首地址int size;       //数组大小(元素个数)
public://成员函数声明
};
//要求测试函数能够运行出正确、合理的结果:
int main()
{int a[8]= {1,2,3,4,5,6,7,8};int b[8]= {10,20,30,40,50,60,70,80};Array array1(a,8),array3,array4;const Array array2(b,8);array4=array3=array1+array2;array3.show();array4.resize(20);array4[8]=99;cout<<array4[8]<<endl;cout<<array2[3]<<endl;return 0;
}

[参考解答]

#include <iostream>
#include <iomanip>
#include <cassert>
using namespace std;class Array
{
private:int* list;      //用于存放动态分配的数组内存首地址int size;       //数组大小(元素个数)
public:Array(int sz = 50);     //构造函数Array(int a[], int sz);     //构造函数Array(const Array &a);  //拷贝构造函数~Array();          //析构函数Array operator + (const Array &a2);     //重载"="Array &operator = (const Array &a2);    //重载"="int &operator[] (int i); //重载"[]"const int &operator[] (int i) const;int getSize() const;        //取数组的大小void resize(int sz);        //修改数组的大小void show() const;
};Array::Array(int sz)  //构造函数
{assert(sz >= 0);//sz为数组大小(元素个数),应当非负size = sz;  // 将元素个数赋值给变量sizelist = new int [size];  //动态分配size个int类型的元素空间
}Array::Array(int a[], int sz)
{assert(sz >= 0);//sz为数组大小(元素个数),应当非负size = sz;  // 将元素个数赋值给变量sizelist = new int [size];  //动态分配size个int类型的元素空间for (int i = 0; i < size; i++) //从对象X复制数组元素到本对象list[i] = a[i];
}Array::~Array()   //析构函数
{delete [] list;
}//拷贝构造函数
Array::Array(const Array &a)
{size = a.size; //从对象x取得数组大小,并赋值给当前对象的成员//为对象申请内存并进行出错检查list = new int[size];   // 动态分配n个int类型的元素空间for (int i = 0; i < size; i++) //从对象X复制数组元素到本对象list[i] = a.list[i];
}Array Array::operator + (const Array &a2)
{assert(size == a2.size);    //检查下标是否越界//如果本对象中数组大小与a2不同,则删除数组原有内存,然后重新分配Array total(size);for (int i = 0; i < size; i++)total.list[i] = list[i]+a2.list[i];return total;   
}//重载"="运算符,将对象a2赋值给本对象。实现对象之间的整体赋值
Array &Array::operator = (const Array& a2)
{if (&a2 != this){//如果本对象中数组大小与a2不同,则删除数组原有内存,然后重新分配if (size != a2.size){delete [] list; //删除数组原有内存size = a2.size; //设置本对象的数组大小list = new int[size];   //重新分配n个元素的内存}//从对象X复制数组元素到本对象for (int i = 0; i < size; i++)list[i] = a2.list[i];}return *this;   //返回当前对象的引用
}//重载下标运算符,实现与普通数组一样通过下标访问元素,并且具有越界检查功能
int &Array::operator[] (int n)
{assert(n >= 0 && n < size); //检查下标是否越界return list[n];         //返回下标为n的数组元素
}
//常对象时,会调用这个函数,运算结果(引用)将不能再被赋值
const int &Array::operator[] (int n) const
{assert(n >= 0 && n < size); //检查下标是否越界return list[n];         //返回下标为n的数组元素
}//取当前数组的大小
int Array::getSize() const
{return size;
}//将数组大小修改为sz
void Array::resize(int sz)
{assert(sz >= 0);    //检查sz是否非负if (sz == size) //如果指定的大小与原有大小一样,什么也不做return;int* newList = new int [sz];    //申请新的数组内存int n = (sz < size) ? sz : size;//将sz与size中较小的一个赋值给n//将原有数组中前n个元素复制到新数组中for (int i = 0; i < n; i++)newList[i] = list[i];delete[] list;      //删除原数组list = newList; // 使list指向新数组size = sz;  //更新size
}void Array::show() const
{for (int i = 0; i < size; i++)cout<< list[i]<<" ";cout<<endl;
}int main()
{int a[8]= {1,2,3,4,5,6,7,8};int b[8]= {10,20,30,40,50,60,70,80};Array array1(a,8),array3,array4;const Array array2(b,8);array4=array3=array1+array2;array3.show();array4.resize(20);array4[8]=99;cout<<array4[8]<<endl;cout<<array2[3]<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL支持的四种索引_Mysql常见四种索引的使用

提到mysql优化&#xff0c;索引优化是必不可少的。其中一种优化方式 ——索引优化&#xff0c;添加合适的索引能够让项目的并发能力和抗压能力得到明显的提升。我们知道项目性能的瓶颈主要是在"查(select)"语句&#xff0c;要提升"查"这一性能&#xff0c;…

java调用、执行groovy代码

java调用、执行groovy代码 1: package test; 2: 3: import javax.script.ScriptEngine; 4: import javax.script.ScriptEngineManager; 5: import javax.script.ScriptException; 6: 7: public class ScriptExcuteUtil { 8: 9: public ScriptExcuteUtil() { 10: 11…

AGS Server 10.1 切图工具

在AGS Sever中很重要的功能就是地图缓存的制作&#xff0c;安装AGS Sever会在catalog中增加相关的工具箱&#xff0c;利用这些工具可以制作、删除、更新切片 一、Convert map server cache storage format(转换服务缓存的存储格式) 利用该工具可以快速的切换地图缓存的格式&…

0511 backlog 项目管理

SCRUM 这次的作业就是确定SCRUM的计划&#xff0c;确定sprint backlog的一个冲刺周期&#xff0c;而这个周期是两个星期。争取在两周内发布1.0版本。 本次作业以网站构建为主&#xff1a; ID NAMEIMPESTHOW TO DONOTES1首页99小时用户登录网站也可以看游客的推广的内容&am…

swing和MySQL登录注册_JavaSwing+Mysql实现简单的登录界面+用户是否存在验证

原生Javamysql登录验证clientlogin.java功能&#xff1a;实现登录页面&#xff0c;与服务端传来的数据验证package LoginRegister;import java.awt.Container;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.regex.Pattern;import …

4月27日微软云训练营活动-现场图集

1.签到 2.到场同学&#xff0c;这一天是工作日&#xff0c;但是人气依然很火。 转载于:https://www.cnblogs.com/finehappy/p/3262296.html

vim编程 插入 保存不退出 保存退出 退出不保存 另存为其他文件名 保存覆盖现有文件...

---恢复内容开始--- 在xshell里写代码&#xff0c;如果需要编辑代码&#xff0c;可以输入 vim xxx.py ,进入vi&#xff4d;编辑界面 这里的xxx.py表示 python的存储文件&#xff0c;后缀名是.py。&#xff11;&#xff0e;插入字符 输入 i 可键入或者shift i&#xff12;&…

wdcp mysql密码_wdcp默认的mysql密码是多少?

重置mysql root密码方法一、Windows环境的找回方法&#xff1a;1、打开cmd命令窗口&#xff0c;先输入命令&#xff1a;net stop mysql 回车 #关闭mysql服务。进入到D:\SOFT_PHP_PACKAGE\mysql\bin\ 目录下&#xff0c;执行mysqld --skip-grant-tables 启动MySQL Server (如果报…

Java中内存中的Heap、Stack与程序运行的关系

堆和栈的内存管理 栈的内存管理是顺序分配的&#xff0c;而且定长&#xff0c;不存在内存回收问题&#xff1b;而堆 则是随机分配内存&#xff0c;不定长度&#xff0c;存在内存分配和回收的问题&#xff1b;堆内存和栈内存的区别可以用如下的比喻来看出&#xff1a;使用堆内存…

ASP.NET Core的配置(5):配置的同步[设计篇]

本节所谓的“配置同步”主要体现在两个方面&#xff1a;其一&#xff0c;如何监控配置源并在其变化的时候自动加载其数据&#xff0c;其目的是让应用中通过Configuration对象承载的配置与配置源的数据同步&#xff1b;其二、当Configuration对象承载的配置放生变换的时候如何向…

mysql 5.6 linux安装配置_linux手动安装配置mysql5.6

1.准备工作①官网下载&#xff1a;https://dev.mysql.com/downloads/mysql/5.6.html#downloads下载之后上传到服务器。②创建linux组用户groupadd mysqluseradd -g mysql mysql2.安装①解压&#xff0c;比如放到了/usr/local/,进入到该目录下&#xff0c;进行用z解压gz包&#…

Winodws Socket I/O模型的整理

Winodws Socket I/O模型的整理大致分以五种.其中Overlapped I/O模型是有两种实现方法. 一&#xff1a;select模型二&#xff1a;WSAAsyncSelect模型三&#xff1a;WSAEventSelect模型四&#xff1a;Overlapped I/O 事件通知模型/完成例程模型五&#xff1a;完成端口IOCP模型 这…

KVM安装Windows Server 2008 R2使用virtio硬盘

在上一篇文章中&#xff0c;我们介绍了使用IDE硬盘来安装Windows Server 2008 R2,这篇文章我们来介绍使用virtio硬盘来安装Windows Server 2008 R2。 说明&#xff1a;KVM默认使用的硬盘格式为virtio。 使用virtio接口的硬盘&#xff0c;我们必须加载virtio硬盘驱动。如果不加载…

Sublime Text 2 入门及技巧

看了 Nettuts 对 Sublime Text 2 的介绍&#xff0c;立刻就兴奋了&#xff0c;诚如作者 Jeffrey Way 所说&#xff1a;“《永远的毁灭公爵》都发布了&#xff0c;TextMate 2 还没发”&#xff0c;你还能指望它么&#xff1f;TextMate 开发者的消极态度已经无法让人忍受了。而作…

跨域名,服务器登录 .

编辑器加载中... function SingleSignOn() {//只能用脚本改变指定 Form 提交的对象 document.getElementById("form1").action"http://。。。。。/WebApp/UsersLogin.aspx"; //把隐藏控件 __VIEWSTATE 中的值变更为 LoginTransfer…

YII 配置文件

用YIIFramework的库开发 Java代码 .... Yii::createWebApplication($config); //没有run Yii::import&#xff08;class1&#xff0c;true&#xff09;,在将class1类文件路径存储时&#xff0c;同时include该文件 注意&#xff1a;你也可以将配置文件分为多个文件&#xff0…

mysql 备份到别的机器_物理拷贝备份mysql到其他机器上恢复

经常会遇到mysql数据要迁徙的情况 &#xff0c;逻辑导出是可以的 但是就是太慢 第三方工具也同样可以用 也是操作麻烦&#xff0c;最简单粗暴的方式就是直接拷贝物理文件来的最快 也很简单 当然 前提是远程服务器和目标服务器是相同的文件系统和mysql版本&#xff0c;不然还是没…

Hibernate映射关系总结篇

又从头学习了一遍hibernate的映射关系&#xff0c;每一次都会有新的收获&#xff0c;总是感觉自己还是不会hibernate。单从配置上说&#xff1a;知其然不知其所以然&#xff0c;马上就要找工作的人了&#xff0c;很是为自己担心呀&#xff01;&#xff01; 众所周知&#xff0c…

iOS内存管理(ARC,MRC)

iOS内存管理方式&#xff1a; ARC Automatic Reference Counting 自动引用计数 MRC Manual Reference Counting 手动引用计数 更改管理方式&#xff1a; 内存管理的问题&#xff1a; 1、内存泄露&#xff1a;不再需要的对象没有释放。 2、野指针&#xff1a;正在使用的对象提前…

height:auto 火狐没边框

css高度设置为auto后&#xff0c;设置的边框 ie正常 火狐 就没有边框了&#xff0c;解决方法 之前是这样写的 #right_bottom { width: 790px; height:auto; border: #EBEBEB 1px solid; } 最后添加了一个overflow: hidden;属性ok了,ie火狐都可以显示边框 即: #right_bottom {…