`
_jia_shun
  • 浏览: 24906 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

C++大学基础教程_11_8_实例研究:Array类

 
阅读更多
//Array.h

#ifndef ARRAY_H_
#define ARRAY_H_
#include <iostream>
using namespace std;

class Array
{
	//友元函数---同时也是重载运算符函数
	friend ostream &operator<<(ostream &,const Array &);
	friend istream &operator>>(istream&,Array &);
public:
	Array(int = 10);//构造函数
	Array(const Array &);//拷贝构造函数
	~Array();//析构函数
	int getSize() const;
	const Array &operator=(const Array &);//重载=
	bool operator==(const Array &) const;//重载==
	bool operator!=(const Array &right) const
	{
		return !(*this == right);//重载!=,利用重载的==函数
	}
	int &operator[](int);//重载[]适用于不是const的对象
	int operator[](int) const;//适用于const对象
private:
	int size;//存放数组的元素个数
	int *Ptr;//指向每个数组第元素的指针
};

#endif

 

//Array.cpp

#include <iostream>
#include <iomanip>
#include <cstdlib>
using namespace std;
#include "Array.h"

//友元重载操作符'<<'函数
//注意输出操作符是output
ostream &operator<<(ostream &output,const Array &testArray)
{
	int i;
	for(i=0;i<testArray.size;i++)
	{
		output << setw(12) << testArray.Ptr[i];
		if((i+1)%4 == 0)//换行
			output << endl;
	}
	if(i%4 != 0)
		output << endl;
	return output;
}

//友元重载操作符'>>'函数
//注意输出操作符是input
istream &operator>>(istream &input,Array &testArray)
{
	for(int i=0;i<testArray.size;i++)
		input >> testArray.Ptr[i];
	return input;
}

Array::Array(int arraySize)
{
	size = (arraySize>0 ? arraySize:10);/*错把两个arraySize写成size!!,蛋疼的错误
	                                                         前后arraySize不一致,试试看咯,简直掉渣天*/
	Ptr = new int[size];
	for(int i=0;i<size;i++)//给数组元素全部赋值为0
		Ptr[i] = 0;
}

//拷贝构造函数
Array::Array(const Array &arrryToCopy)
	:size(arrryToCopy.size)
{
	Ptr = new int[size];
	for(int i=0;i<size;i++)
		Ptr[i] = arrryToCopy.Ptr[i];
}

Array::~Array()
{
	delete [] Ptr;
	Ptr = 0;
}

int Array::getSize() const
{
	return size;
}

//重载=
const Array &Array::operator=(const Array &testArray)
{
	if(this->Ptr != testArray.Ptr)//避免自我复制,赋值
	{
		if(size != testArray.size)
		{
			size = testArray.size;
			delete [] Ptr;
			Ptr = new int[testArray.size];
			for(int i=0;i<size;i++)
				Ptr[i] = testArray.Ptr[i];
		}
	}
	return *this;
}

//重载==
bool Array::operator==(const Array &testArray) const
{
	if(this->size != testArray.size)
		return false;
	for(int i=0;i<testArray.size;i++)
		if(this->Ptr[i] != testArray.Ptr[i])
			return false;
	return true;
}

//重载[],适用不是const的对象
int &Array::operator[](int number)
{
	if((number<0)||(number>=this->size))
		cout << "\nError:number " << number 
		       << "out of range." << endl;
	return this->Ptr[number];
}

int Array::operator[](int number) const
{
	if((number<0)||(number>=this->size))
		cout << "\nError:number " << number 
		       << "out of range." << endl;
	return this->Ptr[number];
}

 

//main.cpp

#include "Array.h"
#include <iostream>
using namespace std;

int main()
{
	Array integers1(7);
	Array integers2;
	cout << "Size of integers1 is " << integers1.getSize()
		   << "\nArray after initialization:\n"  
		   << integers1 << endl;//调用重载运算符函数<<
	cout << "Size of integers2 is " << integers2.getSize()
		   << "\nArray after initialization:\n" 
		   << integers2 ;//调用重载运算符函数<<
	cout << "Enter 17integers:"<< endl;
	cin >> integers1 >> integers2;//调用重载运算符函数>>
	cout << "\nAfter input ,the array contains:\n" 
		   << "Integers1:\n" << integers1
		   << "Integers2:\n" << integers2;
	cout << "\nEvaluating: integers1!=integers2" << endl;
	if(integers1 != integers2)
		cout << "integers1 and integers2 are not equal." << endl;
	
	Array integers3(integers1);//拷贝构造函数
    cout << "Size of integers3 is " << integers3.getSize()
		   << "\nArray after initialization:\n"  
		   << integers3 << endl;//调用重载运算符函数<<

	cout << "Assigning integers2 to integers1:" << endl;
	integers1 = integers2;//调用重载运算符函数=
	cout << "integer1:\n" << integers1
		   << "\ninteger2:\n" << integers2;

	cout << "Evaluating : integers1==integers2 :" << endl;
	if(integers1 == integers2)//调用重载运算符函数==
		cout << "integers1 and integers2 are equal." << endl;

	cout << "integers1[5] is " << integers1[5] << endl;//调用重载运算符函数[] 
	cout << "Assigning 1000 to integers1[5]" << endl;
	integers1[5] = 1000;
	cout << "integers1:\n" << integers1 << endl;
	cout << "Attempt to assign 1000 to integers1[15]" << endl;
	integers1[15] = 1000; 

	system("pause >> cout");
	return 0;
}

 

 

 

  • 大小: 142.9 KB
  • 大小: 68.9 KB
分享到:
评论

相关推荐

    C++大学教程,一本适合初学者的入门教材(part1)

    8.8 实例研究:Array类 8.9 类型之间的转换 8.10 实例研究:String类 8.11 重载十十与—— 8.12 实例研究:Date类 小结 术语 自测练习 自测练习答案 练习 第9章 继承 9.1 简介 9.2 继承:基类和派生类 9.3 ...

    C++大学教程,一本适合初学者的入门教材(part2)

    8.8 实例研究:Array类 8.9 类型之间的转换 8.10 实例研究:String类 8.11 重载十十与—— 8.12 实例研究:Date类 小结 术语 自测练习 自测练习答案 练习 第9章 继承 9.1 简介 9.2 继承:基类和派生类 9.3 ...

    C++大学教程

    C++大学教程(目录) 第1章 计算机与C++编程简介-------------------------------------------------1 1.1 简介--------------------------------------------------------------1 1.2 什么是计算机--------...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

     第Ⅰ部分 C++基础 27  第2章 变量和基本类型 29  2.1 基本内置类型 30  2.1.1 算术类型 30  2.1.2 类型转换 32  2.1.3 字面值常量 35  2.2 变量 38  2.2.1 变量定义 38  2.2.2 变量声明和定义的关系 41  ...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

     第Ⅰ部分 C++基础 27  第2章 变量和基本类型 29  2.1 基本内置类型 30  2.1.1 算术类型 30  2.1.2 类型转换 32  2.1.3 字面值常量 35  2.2 变量 38  2.2.1 变量定义 38  2.2.2 变量声明和定义的关系 41  ...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    标题:PHP基础教程 出处:风流的CG网络日志 时间:Mon, 28 Aug 2006 07:24:34 +0000 作者:yufeng 地址:http:///read.php?38 内容: 提供给新手学习的 PHP新手教程,是一个比较有价值的PHP新手教程! 一、PHP...

    数据结构(C++)有关练习题

    实验一 复习C++有关知识 实验目的: 通过实验掌握下列知识: 1、复习C++有关基本知识; 2、熟悉VC编程、编译和调试环境; 内容及步骤: 编写一个类Complex,定义复数的加法、减法、乘法和除法运算,...

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

    XML越来越热,关于XML的基础教程网络上也随处可见。可是一大堆的概念和术语往往让人望而生畏,很多朋友问我:XML到底有什么用,我们是否需要学习它?我想就我个人学习过程的心得和经验,写一篇比较全面的介绍文章。...

    asp.net知识库

    基础教程 RSS Web2.0时代,RSS你会用了吗?(技术实现总结) 知识集锦:三分钟全面了解 Blog 和 RSS C#+ASP.NET开发基于Web的RSS阅读器 ASP.NET RSS Toolkit(RSS工具) Serialize Your Deck with Positron [XML ...

Global site tag (gtag.js) - Google Analytics