2012-10-11 8 views
5

Mögliche Duplizieren:
Class Data Encapsulation(private data) in operator overloadingVerletzung der Kapselung?

Betrachten Sie bitte dieses Beispiel.

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

In der add() Funktion, ich bin den Wert eines privaten Mitglied von obj2 zugreifen können, wenn ich tatsächlich add() im Rahmen der obj1 genannt habe. Ist das nicht eine Verletzung der Kapselung?

Zuerst dachte ich, dass der Compiler mir einen Fehler wirft, aber es tat es nicht.

+0

Wenn Sie wollten, dass der Compiler sich beschweren würde, warum deklarieren Sie nicht 'add', um stattdessen eine' const'-Referenz zu verwenden? –

Antwort

7

Nr

Encapsulation arbeitet an der Klasse Ebene, nicht auf Instanzebene.

Sie können auf private Mitglieder jeder Instanz Ihrer Klasse zugreifen.
Sie können sogar auf private Member zugreifen, die von Ihrer Klasse definiert sind, indem Sie auf eine von Ihrer Klasse abgeleitete Klasse verweisen.

2

Dies ist keine Verletzung der Kapselung, da Sie auf eine Membervariable in einer Methode zugreifen, die beide zur selben Klasse gehören. Wenn obj2 eine Referenz einer anderen Klasse war, zB yourClass, dann wäre dies ein Verstoß, da Sie auf ein privates Mitglied einer anderen Klasse zugreifen würden.