作者: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; }