为什么'私有'用于面向对象程序?

时间:2016-09-28 06:28:18

标签: c++ oop protected

在c ++语言中有“公共”,“私有”和“受保护”。我尝试了两种简单的程序。

以下是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

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

封装

在第一个例子中,任何人都可以以他们希望的任何方式使用名称。在这个微不足道的例子中,他们不会造成太大的伤害,但如果name是“弗雷德”并将其更改为“巴尼”会导致程序崩溃怎么办?

A.name = "Barney";

程序现在崩溃了。

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

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

绝对没有。

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

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

答案 2 :(得分:0)

受保护的访问修饰符

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

私人访问修改

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

私人比受保护更严格