2012-10-11 18 views
5

可能性の重複:
Class Data Encapsulation(private data) in operator overloadingカプセル化違反?

この例を見てみてください。アドオン()関数で

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; 
} 

、私はOBJ1の文脈で)私は実際にアドオン(と呼ばれてきたobj2ののプライベートメンバの値にアクセスすることができています。これはカプセル化の違反ではありませんか?

私は最初にコンパイラが私にエラーを投げると思っていましたが、それはしませんでした。

+0

コンパイラが文句を言いたいのであれば、代わりに 'add'を宣言して' const'参照をするのはなぜですか? –

答えて

7

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

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

2

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

関連する問題