2010-12-06 10 views
7

クラスのメンバー機能を自分の友人にするとどうなりますか?メンバーの機能を友人にする

以下のコードはコンパイルされ実行されます。友人宣言がなければ、 '演算子の引数が多すぎます。'が生成されます(正しくはそうです)。これを行うことは意味をなさないが、誰が私にここで何が起きているか教えてもらえますか?友人は何らかの方法でデフォルトのこのパラメータを省略するようにコンパイラに指示しますか?あなたは、クラスのメンバ関数自体の友人を作るとどう

class Test 
{ 
public: 
    friend bool operator<(Test& lhs, Test& rhs) 
    { 
    return true; 
    } 
}; 

int main(int c, char** argv) 
{ 
    Test test1; 
    Test test2; 

    return test1 < test2; 
} 
+1

あなたの質問に答えるには:フレンドはC++ 03のbefriendingクラスのメンバーになることはできませんが、C++ 0xでは許可されています。 –

+0

私は興味があります、それは既に完全なアクセス権を持っているので、メンバー機能がそれ自身の友人であることを可能にする可能性のある点はありますか? – radman

+0

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#77または履歴を参照してください(ネストされたクラスはとにかくC++ 0xとほとんどのC++ 03コンパイラのネストクラス)。 –

答えて

9

差は友人が全体の定義がクラス内に表示された場合でも、メンバーではないということです。むしろ、関数は周囲の名前空間に配置されます。だから、thisポインタがありません。メンバーoperator<は暗黙的にthisと明示的な右辺の引数で動作しますが、friendは関数パラメータとして明示的に提供される左辺と右辺の引数を必要とします。 friendバージョンは、クラスの後に関数を置くのと同じですが、privateprotectedのメンバーとベースにアクセスでき、暗黙的にはinlineです(ただし、コンパイラがインライン化する必要はありません。ヒントですが、あなたのfriend機能は多くの翻訳単位から含めることができ、問題なくリンクするという点でOne Definition Ruleに関して重要です)。

1

これは意味をなさない。どのようにクラスのメンバー関数フレンド同じクラスのことができますか?

フレンド機能(メンバー機能ではない)としてoperator <をオーバーロードしました。クラス内にフレンド関数の定義(本体)を提供することは合法です。しかし、その定義内thisを使用することは違法である

friend bool operator<(Test& lhs, Test& rhs) 
{ 
    *this ; //error 
    return true; 
} 
関連する問題