*/
* Copyright (c) 2016,烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名:text.cpp
* 作者:常轩
* 微信公众号:Worldhello
* 完成日期:2016年5月18日
* 版本号:V1.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; // 将元素个数赋值给变量size
list = new int [size]; //动态分配size个int类型的元素空间
} Array::Array(int a[], int sz)
{
assert(sz >= 0);//sz为数组大小(元素个数),应当非负
size = sz; // 将元素个数赋值给变量size
list = 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;
}

运行结果:

心得:

说实话,快让这段代码烦死我了,弄得一点头绪没有。最后附上我的烂码吧

#include<iostream>
using namespace std;
class Array
{
private:
int* list; //用于存放动态分的数组内存首地址
int size;
public:
Array(int a[],l); //构造函数
~Array(); //析构函数
const void show()const;
Array(const Array &a);//复制构造函数
Array operator + (const Array &a2);
int &operator[] (int n);
const int &operator[] (int i) const;
Array &operator = (const Array &a2);
int getSize() const; //取数组的大小
void resize(int sz); //修改数组的大小
};
Array::Array(int a[],l)
{
size=l;
list=new int (size);
for(int i=0;i++i<size)
list[i]=a[i];
}
Array::~Array() //析构函数
{
delete []list;
}
void Array::show() const
{
for (int i = 0; i < size; i++)
cout<< list[i]<<" ";
cout<<endl;
}
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)
{ Array total(size);
for (int i = 0; i < size; i++)
total.list[i] = list[i]+a2.list[i];
return total; //返回当前对象的引用
}
Array &Array::operator = (const Array& a2) //这一段是COPY贺老师的,自己写的太烂
{
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)
{ return list[n]; //返回下标为n的数组元素
} //常对象时,会调用这个函数,运算结果(引用)将不能再被赋值
const int &Array::operator[] (int n) const
{ return list[n]; //返回下标为n的数组元素
} //取当前数组的大小
int Array::getSize() const
{
return size;
} //将数组大小修改为sz
void Array::resize(int 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
}
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;
}

C++走向远洋——51(数组类运算的实现)的更多相关文章

  1. C++走向远洋——64(项目三、数组类模板)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  2. C++走向远洋——42(项目二,我的数组类,深复制,构造函数)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  3. 1.3eigen中数组类和系数的运算

    1.3数组类和系数的运算 与矩阵类只适用与线性代数运算相反,数组类提供通用的数组类,能不利用线性代数的知识来对系数进行操作,比如对每个系数加上一个常数,或者乘上两个数组的系数. 1.数组类型 跟矩阵类 ...

  4. python3.4中自定义数组类(即重写数组类)

    '''自定义数组类,实现数组中数字之间的四则运算,内积运算,大小比较,数组元素访问修改及成员测试等功能''' class MyArray: '''保证输入值为数字元素(整型,浮点型,复数)''' de ...

  5. C++学习之动态数组类的封装

    动态数组(Dynamic Array)是指动态分配的.可以根据需求动态增长占用内存的数组.为了实现一个动态数组类的封装,我们需要考虑几个问题:new/delete的使用.内存分配策略.类的四大函数(构 ...

  6. C++——模板、数组类

    1.函数模板:可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计. 声明方法:template<typename 标识符> 函数声明 求绝对值的模板 #in ...

  7. 日期类&&包装类&&System类&&Math类&&Arrays数组类&&大数据类

    day 07 日期类 Date 构造函数 Date():返还当前日期. Date(long date):返还指定日期 date:时间戳--->距离1970年1月1日 零时的毫秒数 常用方法 日期 ...

  8. C# 使用SIMD向量类型加速浮点数组求和运算(1):使用Vector4、Vector<T>

    作者: 目录 一.缘由 二.使用向量类型 2.1 基本算法 2.2 使用大小固定的向量(如 Vector4) 2.2.1 介绍 2.2.2 用Vector4编写浮点数组求和函数 2.3 使用大小与硬件 ...

  9. OC中数组类NSArray的详解,数组的遍历(二)

    数组类的便利 1.for循环(大家都会的...) 2.NSEmunerator 3.for in 首先重点说下 第二种NSEmunerator枚举器,系统声明是 @interface NSEnumer ...

随机推荐

  1. 吴裕雄--天生自然TensorFlow高层封装:解决ValueError: Invalid backend. Missing required entry : placeholder

    找到对应的keras配置文件keras.json 将里面的内容修改为以下就可以了

  2. pyCharm专业版最新2018激活码激活

    说明:本人亲测有用,对Window.Linux.Mac都稳定有效. 缺点:需要修改hosts文件 步骤: 由于管理权限问题,大部分电脑都不能直接修改hosts文件,所以我们可以先将hosts文件复制到 ...

  3. 正则表达式awk学习(三)

    awk:格式化文本输出 gawk - pattern scanning and processing language awk:gawk的符号链接 基本用法:gawk [options] 'progr ...

  4. mean|mode|median|sample的表达方式

    Measures of Center measures of central tendency:the center or most typical value:average Mean:its ar ...

  5. npm基本语法

    npm -version  查看npm版本 npm install <name>  安装node.js的依赖包 npm install <name> @3.0.6 安装版本为3 ...

  6. Springmvc多视图

    Springmvc多视图 多视图是一个方法可以返回json/xml等格式的数据 第一步:导入xml格式支持的jar包 spring-oxm-3.2.0.RC2.jar 第二步:配置支持多视图 < ...

  7. Angular开发者指南(二)概念概述

    template(模板):带有附加标记的模板HTML directives(指令):使用自定义属性和元素扩展HTML model(模型):用户在视图中显示的数据,并与用户进行交互 scope(作用域) ...

  8. iOS火焰动画效果、图文混排框架、StackView效果、偏好设置、底部手势等源码

    iOS精选源码 高性能图文混排框架,构架顺滑的iOS应用. 使用OpenGLE覆盖阿尔法通道视频动画播放器视图. 可选最大日期截至当日日期的日期轮选器ChooseDatePicker 简单轻量的图片浏 ...

  9. 12款优秀的 JavaScript 日历和时间选择控件

    这些插件能够帮助  Web 开发人员更快速的实现各种精美的日历和时间选择效果. 1. The Coolest Calendar 界面非常漂亮的一款日期选择插件,有详细的使用文档,最新版本 1.5. 点 ...

  10. 解决Navicat无法连接到MySQL的问题

    解决Navicat无法连接到MySQL的问题 问题一:本地IP(xxx.xxx.xxx.xxx)没有访问远程数据库的权限.于是下面开启本地IP(xxx.xxx.xxx.xxx)对远程mysql数据库的 ...