违反封装?

时间:2012-10-11 00:22:51

标签: c++ encapsulation

  

可能重复:
  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()函数中,当我在obj1的上下文中实际调用add()时,我能够访问obj2的私有成员的值。这不是对封装的违反吗?

起初我以为编译器会给我一个错误,但事实并非如此。

2 个答案:

答案 0 :(得分:7)

没有

封装工作在级别,而不是在实例级别。

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

答案 1 :(得分:2)

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