クラスオブジェクトに対して、どのようなクラスメンバーアクセスfriend
関数とメンバー関数があるのだろうか。static
具体的には、違いは何であり、なぜ一方を他方の上に使用するのか。friend
クラスとして、またはstatic
メンバーとして宣言された関数は両方とも、そのクラスの任意のインスタンスのプライベートメンバーにアクセスできることを理解しています。
なぜ彼らが私にとても似ているように見えるのかを示すために簡単な例を挙げましょう。どちらの機能もoperator<
同じMyClass::lessThan
アクセス権限を持っているようで、まったく同じことを実行できます。
class MyClass {
friend bool operator<(const MyClass &left, const MyClass &right);
public:
MyClass(int pub, int priv) : m_pub(pub), m_priv(priv) {}
static bool lessThan(const MyClass &left, const MyClass &right);
int m_pub;
private:
int m_priv;
};
bool operator<(const MyClass &left, const MyClass &right) {
return ( (left.m_pub < right.m_pub) && (left.m_priv < right.m_priv) );
}
bool MyClass::lessThan(const MyClass &left, const MyClass &right) {
return ( (left.m_pub < right.m_pub) && (left.m_priv < right.m_priv) );
}
int main(int argc, const char* argv[]) {
MyClass a(1, 2),
b(3, 4),
c(-1, 1);
cout << "a < b = " << (a<b) << endl;
cout << "a lessThan b = " << MyClass::lessThan(a,b) << endl;
cout << "a < c = " << (a<c) << endl;
cout << "a lessThan c = " << MyClass::lessThan(a,c) << endl;
}
明らかにこれは単純化された例ですが、私の質問は2つの部分からなると思います。
- メンバーアクセスに関して、フレンド関数と静的関数の違いは何ですか?
- どちらを使用するかを決める際には、どのようなことを考慮すべきですか?