5

重複の可能性:
演算子のオーバーロードにおけるクラス データのカプセル化 (プライベート データ)

この例を見てください。

class myClass {
    int a;
public :
    myClass () {
     this->a = 0;
  }

  myClass(int val) {
     this->a = val;
  }

  void add(myClass &obj2) {
     cout << "Result = " << this->a + obj2.a;
     obj2.a = 0;
  }

  void show() {
     cout << "a = " << this->a;
  }
};

int main() {
  myClass obj1(10), obj2(20);

  obj2.show(); //prints 20.
  obj1.add(obj2);
  obj2.show(); //prints 0. 

  return 0;
}

add() 関数では、obj1 のコンテキストで add() を実際に呼び出したときに、obj2 のプライベート メンバーの値にアクセスできます。これはカプセル化の違反ではありませんか?

最初は、コンパイラがエラーをスローするだろうと思っていましたが、そうではありませんでした。

4

2 に答える 2

7

いいえ。

カプセル化は、インスタンス レベルではなく、クラスレベルで機能します。

クラスの任意のインスタンスのプライベート メンバーにアクセスできます。
クラスから派生したクラスへの参照を介して、クラスで定義されたプライベート メンバーにアクセスすることもできます。

于 2012-10-11T00:25:12.600 に答える
2

どちらも同じクラスに属するメソッドのメンバー変数にアクセスしているため、これはカプセル化の違反ではありません。obj2 が yourClass などの別のクラスの参照である場合、別のクラスのプライベート メンバーにアクセスしているため、違反になります。

于 2012-10-11T00:32:38.147 に答える