1 つのクラスの 2 つのオブジェクトをインスタンス化し、1 つのオブジェクトが他のオブジェクトのプライベート フィールドにアクセスして変更します。これは私的なアクセス制御に違反していると思います。OOP のカプセル化を破ります。しかし、C++ と Java の両方がこの「違反」を許しているように見えます。この「違反」が許可されている理由を教えてください。
サンプル C++ コード:
#include <iostream>
using namespace std;
class Person
{
private:
int age;
public:
void changeAge(Person & p, int k) // change peer object's private fields
{
p.age = k;
};
Person(int k)
{
age = k;
};
void showAge()
{
cout << this->age << endl;
};
};
int main()
{
Person a(10);
a.showAge();
Person b(11);
b.changeAge(a, 20); // I think the compiler SHOULD generate access violation error
a.showAge();
b.showAge();
return 0;
};
出力は次のとおりです。
10
20
11
Java 用に同様のコードを記述しても、同じ出力が得られます。
http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.htmlを参照し ました。プライベート フィールドがクラス レベルで表示されることを理解しています。それがおそらく、この「違反」が発生する唯一の実行可能な理由だと思います。(できれば理由もお願いします!)
ただし、OOP のカプセル化が破られるため、この「違反」を許可することは意味がないと思います。私たち二人とも人間であるという事実は、私があなたの個人的なものにアクセスして変更できることを意味するものではありません. できれば、それはもはやあなたの「プライベートなもの」ではありません。
教えてください!「違反」は C++ と Java のバグですか? もし間違っていたら教えてください!