违反封装?

sac*_*aju 5 c++ encapsulation

可能重复:
运算符重载中的类数据封装(私有数据)

请看这个例子.

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;
}
Run Code Online (Sandbox Code Playgroud)

在add()函数中,当我在obj1的上下文中实际调用add()时,我能够访问obj2的私有成员的值.这不是对封装的违反吗?

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

SLa*_*aks 7

没有.

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

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