C++走向远洋——51(数组类运算的实现)
*/
* 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(数组类运算的实现)的更多相关文章
- C++走向远洋——64(项目三、数组类模板)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- C++走向远洋——42(项目二,我的数组类,深复制,构造函数)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- 1.3eigen中数组类和系数的运算
1.3数组类和系数的运算 与矩阵类只适用与线性代数运算相反,数组类提供通用的数组类,能不利用线性代数的知识来对系数进行操作,比如对每个系数加上一个常数,或者乘上两个数组的系数. 1.数组类型 跟矩阵类 ...
- python3.4中自定义数组类(即重写数组类)
'''自定义数组类,实现数组中数字之间的四则运算,内积运算,大小比较,数组元素访问修改及成员测试等功能''' class MyArray: '''保证输入值为数字元素(整型,浮点型,复数)''' de ...
- C++学习之动态数组类的封装
动态数组(Dynamic Array)是指动态分配的.可以根据需求动态增长占用内存的数组.为了实现一个动态数组类的封装,我们需要考虑几个问题:new/delete的使用.内存分配策略.类的四大函数(构 ...
- C++——模板、数组类
1.函数模板:可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计. 声明方法:template<typename 标识符> 函数声明 求绝对值的模板 #in ...
- 日期类&&包装类&&System类&&Math类&&Arrays数组类&&大数据类
day 07 日期类 Date 构造函数 Date():返还当前日期. Date(long date):返还指定日期 date:时间戳--->距离1970年1月1日 零时的毫秒数 常用方法 日期 ...
- C# 使用SIMD向量类型加速浮点数组求和运算(1):使用Vector4、Vector<T>
作者: 目录 一.缘由 二.使用向量类型 2.1 基本算法 2.2 使用大小固定的向量(如 Vector4) 2.2.1 介绍 2.2.2 用Vector4编写浮点数组求和函数 2.3 使用大小与硬件 ...
- OC中数组类NSArray的详解,数组的遍历(二)
数组类的便利 1.for循环(大家都会的...) 2.NSEmunerator 3.for in 首先重点说下 第二种NSEmunerator枚举器,系统声明是 @interface NSEnumer ...
随机推荐
- LeetCode No.154,155,156
No.154 FindMin 寻找旋转排序数组中的最小值 II 题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7 ...
- Qt 使用QGraphicsPixmapItem、QGraphicsScene、QMatrix 的QGraphicsView的显示,缩放
.h QGraphicsScene *scene; QGraphicsPixmapItem *theFrame; QMatrix matrix; .cpp MainWindow::MainWindow ...
- MFC的sendmessage和postmessage 以及sendmessagetimeout
PostMessage只负责将消息放到消息队列中,不确定何时及是否处理,相当于异步操作,执行后马上返回SendMessage要等到受到消息处理的返回码(DWord类型)后才继续,相当于同步操作,一直在 ...
- 【shell基础】条件测试
例1 判断目录是否存在 #!/usr/bin/bash back_dir=/var/mysql_back if ! test -d $back_dir;then mkdir -p $back_dir ...
- day38-进程-事件
#1.事件Event:以交通灯为例.可以控制所有进程等待或者运行. from multiprocessing import Event e = Event() #实例化一个事件,创建一个交通灯,默认是 ...
- VBE2014_Setup_20160709.rar
VBE2014用于各种VBA编程环境的插件,包括VB6 安装本软件之后,在编程环境的“外接程序管理器”中,可以勾选/取消勾选. 在代码区域点击右键,可以对 过程.模块.工程级别的代码进行自动缩进. * ...
- arduino驱动oled
OLED一款小巧的显示屏,感觉可以做出很可爱的东西. 这次实验的这款是128X64的OLED屏幕 , 芯片是SSD1306,请确认自家模块芯片型号,不然对不上号啊 使用IIC的方法,简单实验显示示例程 ...
- F. Moving On
http://codeforces.com/gym/102222/problem/F fory #include<bits/stdc++.h> using namespace std; t ...
- 手撸GBDT原理(未完成)
一直对GBDT里面的具体计算逻辑不太清楚,在网上发现了一篇好博客. 先上总结的关系图 GBDT对类别变量是怎么处理的? 这些东西都是在网上发现的,讲的挺好的. GBDT原理与Sklearn源码分析-回 ...
- python语法基础-函数-进阶-长期维护
############### 函数的命名空间和作用域 ############## """ # 函数进阶 命名空间和作用域 命名空间 全局命名空间——我们自 ...