作者:jicanmeng
时间:2014年11月17日
When the operator does not modify its operands, the best way to overload the operator is via friend function. learncpp.com上面列举了四个例子:
#include <iostream>
using namespace std;
class Cents
{
private:
int m_nCents;
public:
Cents(int nCents){
m_nCents = nCents;
}
//Overload Cents + Cents
friend Cents operator+(const Cents &c1, const Cents &c2);
// Overload cCents + int
friend Cents operator+(const Cents &cCents, int nCents);
int GetCents(){
return m_nCents;
}
};
Cents operator+(const Cents &c1, const Cents &c2)
{
return Cents(c1.m_nCents + c2.m_nCents);
}
Cents operator+(const Cents &c1, int nCents)
{
return Cents(c1.m_nCents + nCents);
}
int main()
{
Cents cCents1(6);
Cents cCents2(8);
Cents cCentsSum1 = cCents1 + cCents2;
Cents cCentsSum2 = cCents1 + 7;
cout << "sum1 have " << cCentsSum1.GetCents() << " cents" << endl;
cout << "sum2 have " << cCentsSum2.GetCents() << " cents" <<endl;
return 0;
}
#include <iostream>
using namespace std;
class Point
{
private:
double m_dX, m_dY, m_dZ;
public:
Point(double dX=0.0, double dY=0.0, double dZ=0.0){
m_dX = dX;
m_dY = dY;
m_dZ = dZ;
}
friend ostream& operator<< (ostream &out, Point &cPoint);
friend istream& operator>> (istream &in, Point &cPoint);
double GetX() { return m_dX; }
double GetY() { return m_dY; }
double GetZ() { return m_dZ; }
};
ostream& operator<< (ostream &out, Point &cPoint)
{
// Since operator<< is a friend of the Point class, we can access
// Point's members directly.
out << "(" << cPoint.m_dX << ", " <<
cPoint.m_dY << ", " <<
cPoint.m_dZ << ")";
return out;
}
istream& operator>> (istream &in, Point &cPoint)
{
in >> cPoint.m_dX;
in >> cPoint.m_dY;
in >> cPoint.m_dZ;
return in;
}
int main()
{
Point cPoint1(2.0, 3.0, 4.0);
Point cPoint2(6.0, 7.0, 8.0);
cout << cPoint1 << " " << cPoint2 << endl;
cout << "Enter a point: " << endl;
Point cPoint;
cin >> cPoint;
cout << "You entered: " << cPoint << endl;
return 0;
}
#include <iostream>
using namespace std;
class Point
{
private:
double m_dX, m_dY, m_dZ;
public:
Point(double dX=0.0, double dY=0.0, double dZ=0.0){
m_dX = dX;
m_dY = dY;
m_dZ = dZ;
}
friend bool operator== (Point &cP1, Point &cP2);
friend bool operator!= (Point &cP1, Point &cP2);
double GetX() { return m_dX; }
double GetY() { return m_dY; }
double GetZ() { return m_dZ; }
};
bool operator== (Point &cP1, Point &cP2)
{
return (cP1.m_dX == cP2.m_dX &&
cP1.m_dY == cP2.m_dY &&
cP1.m_dZ == cP2.m_dZ);
}
bool operator!= (Point &cP1, Point &cP2)
{
return !(cP1 == cP2);
}
int main()
{
Point cPoint1(2.0, 3.0, 4.0);
Point cPoint2(6.0, 7.0, 8.0);
if(cPoint1 == cPoint2){
cout << "cPoint == cPoint2" << endl;
}else{
cout << "cPoint != cPoint2" << endl;
}
return 0;
}
#include <iostream>
using namespace std;
class Cents
{
private:
int m_nCents;
public:
Cents(int nCents = 0){
m_nCents = nCents;
}
// Overload -cCents
friend Cents operator-(const Cents &cCents);
// Return true if use default constructor
friend bool operator! (const Cents &cCents);
int GetCents(){
return m_nCents;
}
};
// note: this function is not a member function!
Cents operator-(const Cents &cCents)
{
return Cents(-cCents.m_nCents);
}
// Return true if use default constructor
bool operator! (const Cents &cCents)
{
return (cCents.m_nCents == 0);
}
int main()
{
Cents cCents1(6);
Cents cCentsSum = -cCents1;
cout << "I have " << cCentsSum.GetCents() << " cents" << endl;
Cents cCents2; // use default contructor to set to m_nCents = 0
if(!cCents2){
cout << "cCents2 was set use default constructor." << endl;
}else{
cout << "cCents2 was set use reload constructor." << endl;
}
return 0;
}