2012-10-11 109 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; 
} 

在add()函数,我能够访问OBJ2的私有成员的值时,我实际上名为add()在OBJ1的情况下。这不是违反封装吗?

起初我在想编译器会给我一个错误,但它没有。

+0

如果你想让编译器抱怨,为什么不声明'add'来取代'const'引用呢? –

回答

7

封装工作在水平,而不能在实例级别。

您可以访问班级的任何实例的私人成员。
你甚至可以通过对你的类派生的类的引用来访问你的类定义的私有成员。

2

这不是对封装的违反,因为您正在访问属于同一个类的方法中的成员变量。如果obj2是另一个类的引用,例如yourClass,那么当您访问另一个类的私有成员时,这将是违规行为。