1つ目はクラスメンバーオーバーロード演算子として定義され、2つ目は非メンバーオーバーロード演算子です。非メンバー関数がプライベートメンバー
private:
int m_nCents;
に アクセスする場合は、friend
追加する必要があります。に変更しpublic:int m_nCents;
ても機能しません。friend
メンバーのアクセス制限のためではなく、ルールのようです。ただし、非メンバー演算子をクラス本体の外に移動して、パブリックメンバー変数にアクセスすることはできます。もっと良いアイデアはありますか?私は混乱しています。ALL非メンバー演算子(オペランドと同じパラメーター番号を持ち、メンバー関数として呼び出すことはできません)はfriend
、クラス本体のように宣言する必要があると思います。
>
は、オペランドごとに2つのパラメーターを持つ二項演算子です。クラスメンバーのオーバーロード演算子には、 1つの明示的なパラメーターと暗黙的なパラメーター>
しかないことがわかりました。非会員のオペレーターは2つ持っている必要があります。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::
これで、クラスメンバー演算子がメンバー関数と同じように修飾子を持っていることがわかります。