Первый определяется как оператор перегрузки члена класса, второй - оператор перегрузки без члена. Когда функция без члена получает доступ к закрытому члену, private:
int m_nCents;
, friend
следует добавить. Даже если я перехожу на public:int m_nCents;
, он неработа. friend
кажется правилом, а не из-за ограничения доступа членов.Но вы можете переместить оператор Nonmember из тела класса и получить доступ к общедоступной переменной-члену.Есть идея получше? Я чувствую растерянность.Я думаю, что ALL Оператор, не являющийся членом (имеет тот же номер параметра с операндом и не может быть вызван как функция-член), должен быть объявлен как friend
в теле класса.
>
isбинарный оператор, который имеет два параметра для каждого операнда.Вы обнаружили, что оператор перегрузки члена класса >
имеет только один явный параметр и неявный this
параметр.Оператор без членов должен иметь два.
class Cents{
private:
int m_nCents;
public:
Cents(int nCents)
: m_nCents(nCents)
{
}
friend bool operator>(Cents &c1, Cents&c2); //Nomember
bool operator<(Cents &c1); //class member
};
bool operator>(Cents &c1, Cents&c2) // <--- why friend?
{
//cout << "in >" << endl;
return (c1.m_nCents > c2.m_nCents) ? true: false;
}
bool Cents::operator<(Cents &c1)
{
//cout << "in <" << endl;
return (this->m_nCents < c1.m_nCents) ? true: false;
}
int main(){
//nomember
//if(poor.operator>(rich)) //compiler error
if(poor > rich){
cout << "oh yeal!" << endl;
}
else
{
cout << "oh no!" << endl;
}
//member
//if(poor.operator<(rich)) //can call this way
if(poor.operator<(rich)){
cout << "oh yeal!" << endl;
}
else
{
cout << "oh no!" << endl;
}
}
Я перемещаю реализации из тела класса.Теперь вы можете видеть, что оператор члена класса имеет квалификатор Cents::
, как и функция-член.