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 ...
随机推荐
- spring boot pom demo
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- Flink(二) —— 部署与任务提交
一.下载&启动 官网上下载安装包,执行下列命令即启动完成. ./bin/start-cluster.sh 效果图 Flink部署模式 Standalone模式 Yarn模式 k8s部署 二.配 ...
- idea发布web项目在tomcat位置问题
(1)war模式这种可以称之为是发布模式,看名字也知道,这是先打成war包,再发布. (2)war exploded模式是直接把文件夹.jsp页面 .classes等等移到Tomcat 部署文件夹里面 ...
- diary-2019.9.16
It has been observed by various scientists and nutritionists that it is better to have smaller and a ...
- [LC] 767. Reorganize String
Given a string S, check if the letters can be rearranged so that two characters that are adjacent to ...
- Laravel5.4 队列简单配置与使用
概述 什么是队列? 百度百科是这样说的 “队列”是在传输过程中保存数据的容器. 举几个生活中例子: * iphone手机新款发布,三里屯iphone进的新货.大家要排队买,不能说一大堆人一起冲进去,那 ...
- 75)PHP,session在使用时的一些语法问题
(1)cookie仅能存字符串类型,但是session能存任何数据类型,比如: 然后我在session_2.php中输出这个session_1.php的数据: 结果展示: 我得在浏览器的地址栏中先请求 ...
- android cpu affinity
暂时无法获取当前线程运行在哪个CPU上,待调查... int omask = 0; int nmask = 0xF0; static void affinity() { int err; int sy ...
- springboot学习笔记:6.内置tomcat启动和外部tomcat部署总结
springboot的web项目的启动主要分为: 一.使用内置tomcat启动 启动方式: 1.IDEA中main函数启动 2.mvn springboot-run 命令 3.java -jar XX ...
- Ajax如何提交数据到springMVC后台
现在好多web项目实现前段和后端分离,实现前端和后端技术人员,使他们加快开发,减少沟通上的问题,后台只需要提供访问接口,而前天只需要调用提供的接口即可.减少前后端的沟通上的成本 本项目是开发中发现aj ...