13

重複の可能性:
obj のプライベート値をクラス インスタンスで変更できるのはなぜですか?

次の (部分的な) コードを検討してください。

class Group {
    private:
      int id;

    public:
      void set_id(int);
      int get_id();
      bool operator==(const Group&);
};


bool Group::operator==(const Group& g) {
    if(g.id == this->id) {  /* id is private? */
            return true;
    }

    return false;
}

コードがコンパイルされ、結果は適切に見えます。しかし、if演算子のオーバーロード実装の部分で、その引数のプライベートメンバー - に直接アクセスしていますが、そのconst Group& gようなアクセスは無効ではないでしょうか?

4

3 に答える 3

23

あなたoperator==はあなたのGroupクラスのメンバーです。メンバー関数は、 だけでなく、アクセスできるすべてのインスタンスprivateについて、そのクラスの任意のメンバーにアクセスできます。this

考えてみると、この動作が必要です。そうしswapないと、オブジェクトがメンバー変数へのパブリックアクセサーを持っていない限り、アクセス制御によって2つ以上のインスタンス( 、コピーコンストラクター、演算子)の相互作用のメソッドが不可能になるためです。方法。多くの場合、設計の観点からは望ましくありません。さらに、アクセス制御のハードルが高くなります (「そのメンバーを公開するだけで、手間がかからずに済みます...」)。

ifこのコードは完全に有効であると結論付けます (ただし、単純に を使用する場合と比較して、 が必要な理由はわかりませんreturn g.id == this->id;) 。

于 2012-09-18T15:14:09.563 に答える
16

アクセス修飾子は、インスタンス レベルではなく、タイプ レベルでアクセスを制御します。型 T のインスタンスのメンバー関数は、まったく同じ型 T の他のインスタンスのすべてのプライベート メンバーにアクセスできます。

はメンバー関数であるためoperator==、メンバーであるクラスのインスタンスのすべてのメンバー変数にアクセスできます。

于 2012-09-18T15:13:40.763 に答える
6

いいえ、operator==は のメンバーであるためですGroup。関数名のすぐそこにあります。つまり、そのクラスの任意のオブジェクトのprivateメンバーにアクセスできます。

フリー関数として記述しようとすると、コンパイルされません。

bool areEqual(const Group& g1, const Group& g2) {
    return g1.id == g2.id;
}
于 2012-09-18T15:13:01.563 に答える