【问题标题】:Why is 'private' used in object oriented program? [duplicate]为什么在面向对象的程序中使用“私有”? [复制]
【发布时间】:2017-02-05 23:09:03
【问题描述】:

在 oop 中像 c++ 语言一样有“public”、“private”和“protected”。我尝试了两种简单的程序。

以下是 C++ 中的第一种情况。

class A { 

public:
    string name;

}

int main(void) {

    A a;
    a.name;

}

还有,第二种情况……

class A { 

protected:
    string name;

public:
    string getName(void) {
        return name;
    }

}

int main(void) {

    A a;
    //a.name;    //can't access
    cout << a.getName();

}

两种情况下哪一种更好?

因为必须隐藏信息,我认为第二个可能更好。但在第二个中,它也可以使用函数getName() 访问“名称”变量。如果是这样,虽然第一个比第二个简单,但我为什么要使用第二个?也就是说,为什么要用protected

【问题讨论】:

  • “因为必须隐藏信息,所以第二个可能更好” - 如果隐藏信息是目标,那么第二个是唯一甚至可以远程限定的,因此默认情况下它会赢得“更好”。

标签: c++ oop protected


【解决方案1】:

第二个是更好的类,我们将数据紧紧地封装在类中,并且通过使用protected允许继承范围。成员名只能通过类的成员函数来改变。

在第一类中,通过将成员设为公共,我们允许来自程序的外部函数操作数据,这实际上并不是一个好的编程习惯。

【讨论】:

    【解决方案2】:

    封装。

    在第一个示例中,任何人都可以按照自己的意愿使用名称。在这个微不足道的例子中,它们不会造成太大的伤害,但如果 name 是“Fred”并将其更改为“Barney”会导致程序崩溃?

    A.name = "Barney";
    

    程序现在崩溃。

    在第二个示例中,name 不可访问。 getName 返回name 的副本。收件人可以对这个副本做任何他们想做的事,而不会破坏A的内部状态,所以

    string temp = A.getName();
    temp = "Barney";
    

    什么都不做。

    将此视为对象的自卫。现在,每个对象都可以控制其内部状态的修改方式,并且可以保护自己免受意外误用和损坏。

    A 的用户甚至不必知道他们从getName 获得的信息是如何存储的。他们只知道他们得到了string。这将A 与其用户分离。

    【讨论】:

      【解决方案3】:

      受保护的访问修饰符

      受保护的访问修饰符可在包内和包外访问,但只能通过继承访问。

      私人访问修饰符

      私有访问修饰符只能在类中访问。 Private 主要用于抽象。

      例子

      package pack;  
      public class A{  
      protected void msg(){System.out.println("Hello");}  
      }  
      //save by B.java  
      package mypack;  
      import pack.*;  
      
      class B extends A{  
        public static void main(String args[]){  
         B obj = new B();  
         A obj = new B();//compile time error
         obj.msg();  
        }  
      }  
      Output:Hello
      

      private 比 protected 更严格

      【讨论】:

        猜你喜欢
        • 2023-03-31
        • 1970-01-01
        • 2021-01-19
        • 2010-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-21
        • 2011-06-29
        相关资源
        最近更新 更多