java - C++ 和 Java OOP 访问控制冲突 : access peer object's private fields

标签 java c++ private-members

我实例化一个类的两个对象,一个对象访问和更改另一个对象的私有(private)字段。我相信这违反了私有(private)访问控制。它破坏了 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 我了解私有(private)字段在类级别可见。我相信这可能是发生这种“违规”的唯一可行原因。 (如果可以,请补充更多原因!)

但是,我认为允许这种“违规”是没有意义的,因为它破坏了 OOP 中的封装。我们都是人这一事实并不意味着我可以访问和修改您的私有(private)资料。如果可以的话,这不再是您的“私有(private)元素”。

请赐教! “违规”是 C++ 和 Java 的错误吗?如果我错了,请告诉我!

最佳答案

这绝对不是任何一种语言的“错误”。它们已经很成熟,并且被设计成以这种方式运作。访问控制在类级别而不是对象级别运行。因此,当 Person 将某些内容设为私有(private)时,这意味着只有 Person 类中的代码才能对其进行操作,但所讨论的对象无关紧要。

重点是将对象内部知识隔离到特定代码段,而不是确保一个对象不能操纵另一个对象。

不要错误地认为 OOP 是一套完善的规则。许多不同的语言实现了来自 OO 的不同思想,并且它们之间存在差异。如果资源明确地告诉您 OO“意味着”任何特定的事物,那么它们就是在误导您。有很多内容可供语言设计者和程序作者解释。

关于java - C++ 和 Java OOP 访问控制冲突 : access peer object's private fields,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11354649/

相关文章:

java - 为什么整数键在 HashMap 中不起作用?

java - 如何将 byte[] 写入 IoSession

C++ 原子数组是否也需要是原子的?

C++从静态成员函数更改私有(private)成员变量

python - 在 Python 中覆盖 "private"方法

java - 谁来设置 JAXWS 2.2 客户端超时

java - 编译时错误或运行时错误

c++ - 试图找到名字的中间名首字母

c++ - SWIG 将流从 python 传递到 C++

c++ - 使用 GoogleTest 访问私有(private)成员