2016-09-28 32 views
-2

像C++语言一样,在'oop'中有'public','private'和'protected'。我尝试了两种简单的程序。为什么在面向对象的程序中使用'private'?

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

+0

“由于信息必须被隐藏,第二个是有可能更好” - 如果隐藏的信息是目标,第二个是*只有*一个即使远程资格,所以它默认赢得“更好”。 – WhozCraig

回答

0

封装。

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

A.name = "Barney"; 

程序现在崩溃。

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

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

绝对没有。

认为这是对象的自我防御。每个对象现在都可以控制内部状态如何被修改,并且可以防止意外误操作和损坏。

A的用户甚至不需要知道他们如何从getName中得到储存。他们只知道他们得到了string。这从它的用户分解A

0

第二个是较好的一类,我们是紧密封装的数据类,并允许继承的范围,通过使用保护。成员名称只能由类的成员函数更改。

在第一类中,通过使成员作为公众,我们允许从外部程序处理功能这实际上不是一个良好的编程习惯数据。

0

保护访问修饰符

受保护的访问修饰符是包内包外,但通过继承才能访问。

私人的访问修饰符

私有访问修饰符只能在类访问。 私有基本上用于抽象。

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 

私人不止严格保护

相关问题