为什么在面向对象程序中使用 'private'?

Why is 'private' used in object oriented program?

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() 来访问 'name' 变量。如果是这样,虽然第一个比第二个简单,但我为什么要使用第二个?也就是说,为什么要用protected

第二个更好class,我们将数据紧密封装到class并且还通过使用protected允许继承范围。成员名称只能由class的成员函数改变。

首先 class,通过将成员设为 public,我们允许程序中的外部函数操作数据,这实际上不是一个好的编程习惯。

封装。

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

A.name = "Barney";

程序现在崩溃了。

在第二个示例中,name 无法访问。 getName returns name 的副本。收件人可以在不破坏 A 内部状态的情况下对此副本做任何他们想做的事情,所以

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

什么都不做。

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

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

受保护的访问修饰符

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

私有访问修饰符

私有访问修饰符只能在 class 内访问。 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 更严格