C ++& Java OOP访问控制冲突:访问对等对象的私有字段

时间:2012-07-06 01:12:16

标签: java c++ private-members

我实例化一个类的两个对象,一个对象访问并更改另一个对象的私有字段。我认为这违反了私人访问控制。它破坏了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 ++&amp;的错误? Java的?如果我错了,请告诉我!

3 个答案:

答案 0 :(得分:4)

绝对不是&#34; bug&#34;用两种语言它们已经很成熟,并且设计为以这种方式运行。访问控制在类级别而不是对象级别上运行。因此,当Person使某些内容成为私有时,这意味着只有Person类中的代码才能操作它,但所讨论的对象无关紧要。

关键是要将对象内部的知识与特定的代码片段隔离开来,而不是确保一个对象不能操纵另一个对象。

不要错误地认为OOP是一套完善的规则。许多不同的语言从OO实现不同的想法,并且它们之间存在差异。如果资源明确地告诉你OO&#34;意味着&#34;任何具体的事情,那么他们会误导你。语言设计师和程序作者可以很好地解释这些内容。

答案 1 :(得分:2)

在C ++中,至少,如果你不能访问同一个类的另一个对象的私有字段,那么你就无法编写复制构造函数,也无法编写大量有用的运算符和其他东西。绕过它的唯一方法是使用公共访问器方法,但是任何人都可以调用访问器方法,而且你的FAR会比现在更差!

如果你考虑一下,C ++和Java都有CLASS级封装,而不是OBJECT级封装。假设同一个类的其他对象(即运行相同方法的其他对象)不会对同一个类的对象做任何过于愚蠢的事情。

答案 2 :(得分:1)

私有字段只能由它们所在的类访问。如果你有2个对象,Person A和Person B,它们都是Person,并且都需要能够被类中的方法操纵。正如其他人所说,保护来自于能够操纵数据的其他类,而不是对象。

所以不,这不是违规行为。