2

クラスオブジェクトに対して、どのようなクラスメンバーアクセス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つの部分からなると思います。

  1. メンバーアクセスに関して、フレンド関数と静的関数の違いは何ですか?
  2. どちらを使用するかを決める際には、どのようなことを考慮すべきですか?
4

5 に答える 5

2

フレンド関数のプロトタイプはクラス定義に表示されますが、フレンド関数は関数メンバーではないことに注意してください。クラスのフレンド関数はクラスから離れて定義されていますが、フレンド関数は非パブリック メンバーにアクセスしています。「友情」が情報隠蔽を台無しにすると考える人もいます。フレンド関数を使用してテスター クラスを作成することがあります。

静的データ メンバーは、オブジェクト クラスが変数のコピーを 1 つだけ共有する必要がある場合に使用されます。そのため、すべてのクラス メンバーに対して 1 つのコピーだけで十分な場合は、ストレージを節約するために静的データ メンバーを使用する必要があります。

静的メンバー関数については、次を参照してください。静的メンバー関数を使用する場合は?

于 2012-09-12T00:12:26.553 に答える
1

それらは異なる概念です:

クラス、メソッド、または関数がクラス X のフレンドである場合、そのクラス、関数、またはメソッドは、private と宣言されたクラス X のメンバーにアクセスできるため、通常、クラス外ではアクセスできません。

class A{
  private:
     int x;
  friend void foo(A& a);

};

void foo(A& a){
    a.x = 3; //Access okay, foo is a friend of A
} 

void bar(A& a){
   a.x = -1; // Compiler will complain A::x is private
}

静的メンバーは、そのクラスのすべてのオブジェクト インスタンス間で共有されるデータ メンバー、またはそのクラスのインスタンス オブジェクトなしで呼び出すことができるメソッドのいずれかです。

class B{

  private:
    static int y;

  public:
    static void printY();
    void alterY();

}

int B::y=3;

void B::printY(){
   cout<<y;
}

void B::alterY(){
   y++;
   cout<<y;
}


B b1,b2;
B::printY();// will output 3
b1.alterY();// will output 4
b2.alterY();// will output 5
于 2012-09-12T00:04:04.540 に答える
1

静的メソッドは、クラスのインスタンスを介さずに呼び出すことができるため、直接アクセスすることはできません。グローバル関数に似ていますが、クラスの名前空間にネストされています。ただし、そのクラスのインスタンスをパラメーターとして指定すると、非静的メソッドと同様に、アクセサーを介さずにメンバー変数にアクセスできます。静的メソッドと同様に、フレンド関数は、フレンドであるクラスのインスタンスをパラメーターとして指定すると、メンバー変数に直接アクセスできるようになります。

于 2012-09-12T00:04:35.993 に答える
1
  1. どちらもプライベートメンバーを含むクラスのすべてのメンバーにアクセスできます
  2. 関数が必要なメンバーへのアクセスが必要なクラスに論理的に属しているかどうか、または別のクラスに属しているか、まったくクラスに属していないかを判断する必要があります。最初のケース (論理的にクラスに属する関数) では、関数を静的にします。2 番目のケースでは、それをフレンドにして、設計に従って、それが論理的に属するクラスまたは名前空間に追加します。
于 2012-09-12T00:04:49.267 に答える
0

メンバー アクセスに関するフレンド関数と静的関数の違いは何ですか?

なし。どちらも完全なアクセス権です。

どちらを使用するかを決定する際には、どのようなことを考慮する必要がありますか?

それは文脈とコードを読みやすくするものに完全に依存します。

上記の例では、コードがより直感的に読みやすくなるため、私は間違いなく優先bool operator<() します。MyClass::lessThan()

于 2012-09-12T00:24:56.313 に答える