作者:jicanmeng
时间:2014年11月17日
For operators that do modify their operands, we typically overload the operator using a member function of the class.
Overloading operators using a member function is very similar to overloading operators using a friend function. When overloading an operator using a member function:
Most operators can actually be overloaded either way, however there are a few exception cases:
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
Cents operator+(int nCents);
int GetCents(){
return m_nCents;
}
};
//note: this function is not a member function!
Cents operator+(const Cents &c1, const Cents &c2)
{
//use the Cents constructor and operator+(int, int)
return Cents(c1.m_nCents + c2.m_nCents);
}
Cents Cents::operator+(int nCents)
{
return Cents(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 Digit
{
private:
int m_nDigit;
public:
Digit(int nDigit=0)
{
m_nDigit = nDigit;
}
Digit& operator++(); // prefix
Digit& operator--(); // prefix
Digit operator++(int); // postfix
Digit operator--(int); // postfix
int GetDigit() const { return m_nDigit; }
};
Digit& Digit::operator++()
{
// If our number is already at 9, wrap around to 0
if (m_nDigit == 9)
m_nDigit = 0;
// otherwise just increment to next number
else
++m_nDigit;
return *this;
}
Digit& Digit::operator--()
{
// If our number is already at 0, wrap around to 9
if (m_nDigit == 0)
m_nDigit = 9;
// otherwise just decrement to next number
else
--m_nDigit;
return *this;
}
Digit Digit::operator++(int)
{
// Create a temporary variable with our current digit
Digit cResult(m_nDigit);
// Use prefix operator to increment this digit
++(*this); // apply operator
// return temporary result
return cResult; // return saved state
}
Digit Digit::operator--(int)
{
// Create a temporary variable with our current digit
Digit cResult(m_nDigit);
// Use prefix operator to increment this digit
--(*this); // apply operator
// return temporary result
return cResult; // return saved state
}
int main()
{
Digit cDigit1(5), cDigit2(5), digit1, digit2;
digit1 = ++cDigit1; // calls Digit::operator++();
digit2 = cDigit2++; // calls Digit::operator++(int);
cout << "digit1 is " << digit1.GetDigit() << endl;
cout << "digit2 is " << digit2.GetDigit() << endl;
return 0;
}
#include <iostream>
#include <cassert> // for assert()
using namespace std;
class IntList
{
private:
int m_anList[10];
public:
int& operator[] (const int nIndex);
};
int& IntList::operator[] (const int nIndex)
{
assert(nIndex >= 0 && nIndex < 10);
return m_anList[nIndex];
}
int main()
{
IntList cMyList;
cMyList[2] = 3; // set a value
cout << cMyList[2] << endl; // get a value
return 0;
}
#include <iostream>
#include <cassert> // for assert()
using namespace std;
class Matrix
{
private:
double adData[4][4];
public:
Matrix(){
// Set all elements of the matrix to 0.0
for (int nCol=0; nCol<4; nCol++)
for (int nRow=0; nRow<4; nRow++)
adData[nRow][nCol] = 0.0;
}
double& operator()(const int nCol, const int nRow);
void operator()();
};
double& Matrix::operator()(const int nCol, const int nRow)
{
assert(nCol >= 0 && nCol < 4);
assert(nRow >= 0 && nRow < 4);
return adData[nRow][nCol];
}
void Matrix::operator()()
{
// reset all elements of the matrix to 0.0
for (int nCol=0; nCol<4; nCol++)
for (int nRow=0; nRow<4; nRow++)
adData[nRow][nCol] = 0.0;
}
int main()
{
Matrix cMatrix;
cMatrix(1, 2) = 4.5;
cout << cMatrix(1, 2) << endl;
cMatrix(); // erase cMatrix
cout << cMatrix(1, 2) << endl;
return 0;
}
#include <iostream>
using namespace std;
class Cents
{
private:
int m_nCents;
public:
Cents(int nCents=0)
{
m_nCents = nCents;
}
// Overloaded int cast
operator int() { return m_nCents; }
int GetCents() { return m_nCents; }
void SetCents(int nCents) { m_nCents = nCents; }
};
class Dollars
{
private:
int m_nDollars;
public:
Dollars(int nDollars=0)
{
m_nDollars = nDollars;
}
// Allow us to convert Dollars into Cents
operator Cents() { return Cents(m_nDollars * 100); }
};
void PrintInt(int nValue)
{
cout << nValue;
}
void PrintCents(Cents cCents)
{
// cout << cCents.GetCents(); //use this line of code or next line
PrintInt(cCents);
}
int main()
{
Cents cCents(7);
PrintInt(cCents); // cCents will be cast tot a int
cout << endl;
int nCents = static_cast<int>(cCents);
cout << "using explicitly cast: nCents is " << nCents << endl;
Dollars cDollars(9);
PrintCents(cDollars); // cDollars will be cast to a Cents
cout << endl;
return 0;
}
#include <iostream>
using namespace std;
class Cents
{
private:
int m_nCents;
public:
Cents(int nCents){
m_nCents = nCents;
}
Cents operator-();
int GetCents(){
return m_nCents;
}
};
Cents Cents::operator-()
{
return Cents(-m_nCents);
}
int main()
{
Cents cCents1(6);
Cents cCentsSum = -cCents1;
cout << "I have " << cCentsSum.GetCents() << " cents" << endl;
return 0;
}