为什么是';私人';用于面向对象程序? 在OOP中,有“公共”、“私有”和“保护”等C++语言。我尝试了两种简单的程序 以下是C++中的第一个例子。 class A { public: string name; } int main(void) { A a; a.name; }

为什么是';私人';用于面向对象程序? 在OOP中,有“公共”、“私有”和“保护”等C++语言。我尝试了两种简单的程序 以下是C++中的第一个例子。 class A { public: string name; } int main(void) { A a; a.name; },c++,oop,protected,C++,Oop,Protected,第二种情况 class A { protected: string name; public: string getName(void) { return name; } } int main(void) { A a; //a.name; //can't access cout << a.getName(); } A类{ 受保护的: 字符串名; 公众: 字符串getName(void){ 返回名称;

第二种情况

class A { 

protected:
    string name;

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

}

int main(void) {

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

}
A类{
受保护的:
字符串名;
公众:
字符串getName(void){
返回名称;
}
}
内部主(空){
A A;
//a、 name;//无法访问

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

在第一个类中,通过将成员公开,我们允许程序中的外部函数操作数据,这实际上不是一个好的编程实践。

封装

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

A.name = "Barney";
程序现在崩溃了

在第二个示例中,
name
是不可访问的。
getName
返回
name
的副本。收件人可以对该副本执行任何操作,而不会损坏
a
的内部状态,因此

string temp = A.getName();
temp = "Barney";
什么都不做

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


A
的用户甚至不必知道他们从
getName
中获得的内容是如何存储的。他们所知道的只是他们得到一个
字符串。这将
A
与它的用户分离。

受保护的访问修饰符

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

专用访问修饰符

私有访问修饰符只能在类中访问。 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

私有比受保护更严格

“因为信息必须隐藏,第二个可能更好”-如果目标是隐藏信息,那么第二个可能是唯一一个远程符合条件的,因此默认情况下它会赢得“更好”。