規則:
作爲類成員函數:
1.左操作數必須爲該類的對象;
作爲友元函數:
1.若左操作數不是該類的對象,操作符函數不能作該類的成員函數;
2.若想直接訪問該類的private和protected成員,非成員操作符函數必須爲友元函數。
case1:<<和>>的重載
代碼:
ostream &operator<<(ostream &output, const phoneNumber &num) istream &operator>>(istream &input, phoneNumber &num) int main()
{
output <<"("<<num.areaCode<<") "
<<num.exchange<<"-"<<num.line;
return output;
}
{
input.ignore();
input>>setw(4)>>num.areaCode;
input.ignore(2);
input>>setw(4)>>num.exchange;
input.ignore();
input>>setw(5)>>num.line;
return input;
}
{
phoneNumber phone;
cout<<"Enter phone number in the form (123) 456-7890:\n";
cin>>phone;
cout<<"The phone number entered is: "<<phone<<endl;
return 0;
}
using std::cout;
using std::cin;
using std::endl;
using std::ostream;
using std::istream;
#include <iomanip>
using std::setw;
class phoneNumber
{
friend ostream& operator <<(ostream&, const phoneNumber&);
friend istream& operator >>(istream&, phoneNumber&);
private:
char areaCode[4];
char exchange[4];
char line[5];
};
Enter phone number in the form (123) 456-7890:
(800) 555-1212
The phone number entered is: (800) 555-1212
case2: 實現整型數組類的操作符重載:
代碼:
#include <cassert>
#include <iostream>
#include <cstdlib>
#include <iomanip>
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;
static int getArrayCount();
private:
int size; //array size
int *ptr; //ponter to first element
static int arrayCount; //# of arrays instantiated
};
int Array::arrayCount= 0; //no object yet
Array::Array(int arraySize)
{
size = (arraySize > 0 ? arraySize : 10);
ptr = new int[size];
assert(ptr!=0); //terminate if memory not allocated
++arrayCount;
for(int i=0; i<size; i++) ptr[i]=0;
}
Array::Array(const Array &init):size(init.size)
{
ptr = new int[size];
assert( ptr !=0);
++arrayCount;
for(int i=0; i<size; i++)
ptr[i]=init.ptr[i];
}
Array::~Array()
{
delete []ptr;
--arrayCount;
}
int Array::getSize() const {return size;}
//const return avoids:(a1=a2)=a3
const Array& Array::operator=(const Array &right)
{
if(&right != this) //check for self-assignment
{
if(size!=right.size)
{
delete []ptr;
size = right.size;
ptr = new int[size];
assert(ptr!=0);
}
for(int i=0; i<size; i++)
ptr[i]=right.ptr[i];
}
return *this;
}
bool Array::operator==(const Array &right) const
{
if(size!=right.size) return false;
for(int i=0; i<size; i++)
if(ptr[i]!=right.ptr[i]) return false;
return true;
}
int &Array::operator[](int subscript)
{
assert(0<=subscript && subscript < size);
return ptr[subscript];
}
const int &Array::operator[](int subscript) const
{
assert(0<=subscript && subscript < size);
return ptr[subscript];
}
int Array::getArrayCount() {return arrayCount; }
istream &operator>>(istream &input, Array &a)
{
for(int i=0; i<a.size; i++) input >> a.ptr[i];
return input;
}
ostream &operator<<(ostream &output, const Array &a)
{
for(int i=0; i<a.size; i++)
{
output << setw(12)<<a.ptr[i];
if((i+1)%4==0) output<<endl;
}
return output;
}
int main()
{
cout << "# of arrays instantiated = "
<< Array::getArrayCount()<<endl;
Array integer1(7), integer2;
cout << "# of arrays instantiated = "
<< Array::getArrayCount() << endl;
cout << "Size of array integer1 is "
<< integer1.getSize()
<< "\nArray after initialization:\n"
<< integer1 << endl ;
cout << "Size of array integer2 is "
<< integer2.getSize()
<< "\nArray after initiazation:\n"
<< integer2 << endl ;
cout << "Input integers: " << endl;
cin >> integer1 >> integer2 ;
cout << "After input, the arrays contain:\n"
<< "integer1:\n" << integer1 << endl
<< "integer2:\n" << integer2 << endl ;
cout << "Evaluating: integer1!=integer2\n";
if(integer1!=integer2)
cout << "They are not equal\n";
Array integer3(integer1) ;
cout << "\nSize of array integer3 is "
<< integer3.getSize()
<< "\nArray after initialization:\n"
<< integer3 << endl ;
cout << "Assigning integer2 to integer1:\n" ;
integer1 = integer2;
cout << "integer1:\n" << integer1 << endl
<< "integer2:\n" << integer2 << endl ;
cout<< "Evaluating: integer1==integer2\n";
if(integer1==integer2)
cout << "They are equal" << endl;
cout << "integer1[5] is " << integer1[5] << endl;
cout << "Assgning 1000 to integer1[5]\n";
integer1[5] = 1000 ;
cout << "integer1:\n" << integer1 << endl;
return 0;
}