//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; }