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 回答