您的位置:首页 > 编程语言 > C语言/C++

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

2014-07-16 08:59 447 查看
//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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: