一个让人灵光一闪的数组C++类Array设计,可以此作为范本进行其他的C++类编写
2017-07-29 16:46
519 查看
一个基于指针和重载操作符的数组类设计Array,可以进行数组范围检查,与平常看到的类而言,这个类的编写让人感觉逻辑十分清晰,以及更加可以理解面向对象程序设计理念。
Arry.h
Array.cpp
Arry.h
/*-----防止类头文件重复包含--------------------------------------*/ #ifndef ARRAY_H #define ARRAY_H /*-----包含输入输出流头文件--------------------------------------*/ #include <iostream> using namespace std; class Array { /*-----重载输入输出符号的友元函数--------------------------------------*/ friend ostream &operator<<(ostream &,const Array &); friend ostream &operator>>(iostream &,Array &); public: explicit Array(int = 10);//默认构造函数 Array(const Array &);//拷贝构造函数 ~Array();//析构函数 size_t getSize() const; //得到数组大小 const Array &operator=( const Array & );//重载操作符= bool operator==(const Array &)const;//重载操作符== bool operator !=(const Array &right)const//重载操作符!= { return !(*this==right); } int &operator[]( int );//重载操作符[] int operator[]( int )const;//重载操作符[] private: size_t size;//数据成员size标识数组大小 int *ptr;//数组指针 }; #endif;
Array.cpp
/*-----Array类的函数定义和友元函数定义-------------------------------------*/ #include <iostream> #include <iomanip> #include <stdexcept> #include "Array.h" using namespace std; /*------Array类的默认构造函数,数组大小为10--------------------------------*/ Array::Array(int arraysize):size( arraysize>0?arraysize:throw invalid_argument("Arrat size must be greater than 0")),ptr(new int [size]) { for (size_t i=0;i<size;++i) { ptr[i]=0; } } /*-----Array类的拷贝构造函数----------------------------------------------*/ Array::Array(const Array &arrayToCopy):size(arrayToCopy.size),ptr(new int [size]) { for (size_t i=0;i<size;++i) { ptr[i]=arrayToCopy.ptr[i]; } } /*-----Array类的析构函数---------------------------------------------------*/ Array::~Array() { delete [] ptr; } /*-----得到数组的大小-----------------------------------------------------*/ size_t Array::getSize() const { return size; } /*-----重载=操作符--------------------------------------------------------*/ const Array &Array::operator =(const Array &right) { if (*right != this)//避免自己给自己赋值 { //如果两个数组的大小不一样,那就先释放原有数组 //然后声明与右边数组大小一样的数组 if (size != right.size) { delete [] ptr; size =right.size; ptr=new int[size]; } //进行赋值 for (size_t i=0;i<size;++i) { ptr[i]=right.ptr[i]; } } return *this; } /*-----重载==操作符-------------------------------------------------------*/ bool Array::operator ==(const Array &right)const { if (size != right.size)//如果两个数组的大小不一样,直接返回false { return false; } for (size_t i=0;i<size;++i)//如果数组一样,比较对应的元素是否一样,如果不一样,返回false { if (ptr[i] != right.ptr[i]) { return false; } } return true;//不然返回true } /*-----重载[]操作符-------------------------------------------------------*/ int &Array::operator [](int subscript) { if (subscript<0||subscript>=size) { throw out_of_range("Subscript out of range"); } return ptr[subscript]; } /*-----重载[]操作符-------------------------------------------------------*/ int Array::operator [](int subscript) const { if (subscript<0||subscript>=size) { throw out_of_range("Subscript out of range"); } return ptr[subscript]; } /*-----友元函数,重载输入运算符>>----------------------------------------*/ iostream &operator>>(istream &input,Array &a) { for (size_t i=0;i<a.size;++i) { input>>a.ptr[i]; } return input; } /*-----友元函数,重载输入运算符<<----------------------------------------*/ ostream &operator<<(ostream &output,const Array &a) { for (size_t i=0;i<a.size;++i) { output<<setw(12)<<a.ptr[i]; if ((i+1)%4==0) { output<<endl; } } if (a.size%4 !=0) { output<<endl; } return output; }
相关文章推荐
- 编写一个使用数组类模板Array对数组进行排序、求最大值和求元素和的程序,并采用相关数据进行测试。
- 编写一个使用数组类模板Array对数组进行排序、求最大值和求元素和的程序,并采用相关数据进行测试。
- Hive thrift服务(将Hive作为一个服务器,其他机器可以作为客户端进行访问)
- 编写一个学生信息管理系统:学生信息包括有(学生学号、姓名、性别、手机号码),系统以学生对象数组的方式存储学生信息 (初始数组为10个元素,每当数组存储满时,需要进行扩容,规则可以为翻倍也可以固定增长
- 把一个数组中的0元素移动到数组最尾端,其他非0元素进行排序,最后输出
- //设计一个函数模板 max <T>求一个数组中最大的元素,并以整数数组和字符数 //组进行调用。
- 写一个算法,使对象可以像数组一样进行foreach循环,要求属性必须是私有的(Interator模式的PHP5实现,写一类实现Interator接口)
- 要求从用户输入的多行文本中提取学生的姓名、学号及登录日期,并封装到 Student 类中作为类的私有属性。创建一个Student类型的对象数组,对学号进行 升序排序并输出。
- 最近设计了一个生成asp代码的程序,同时也可以作为数据库管理查询的软件,有兴趣的朋友可以去下载!
- 说你有一个数组,其中第i个元素是第i天给定股票的价格。设计一个算法来找到最大的利润,最多可以完成两个交易。
- google校招笔试题 2.2 长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap,请设计并实现排序。
- Flex中如何将一个数组Array作为Tree的数据提供元
- <笔试><面试>编写一个排序函数,实现,既可以排序整形数组,又可以排序字符串。
- 《c primer pius》第十章第6题,编写一个程序,初始化一个二维double数组,并利用练习2中的任一函数来把这个数组复制到另一个二维数组(因为二维数组是数组的数组,所以可以使用处理一维数组的
- 实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制。
- 长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap 请设计并实现排序
- 程序员面试金典——解题总结: 9.18高难度题 18.8给定一个字符串s和一个包含较短字符串的数组T,设计一个方法,根据T中的每一个较短字符串,对s进行搜索
- 【嵌入式系统学习记录】练习:编写一个函数,求字符数组的前n个字符中最大字符的地址并返回该地址,字符数组和n作为函数的参数;
- filteredArrayUsingPredicate通过给定条件来进行过滤,过滤后形成一个新的数组
- 编写一个程序,要求用户输入最多10个高尔夫成绩,并将其存储在一个数组中。 程序允许用户提早结束输入,并在一行上显示所有成绩,然后报告平均成绩。 请使用3个数组处理函数来分别进行输入、显示和计算