2016-09-28 31 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 

私人不止嚴格保護

相關問題