2011-04-09 94 views
3
class Foo 
{ 
public: 
void someFunk(Foo &bar); 
private: 
int a; 
... 
}; 

void Foo::someFunk(Foo &bar) 
{ 
a = bar.a; 
} 

我注意到作爲參數傳遞的對象被允許訪問私有數據成員。我可以看到爲什麼這個指針,但不應該作爲參數傳遞的對象必須調用訪問器?我認爲這是錯誤的,但代碼正在爲我編譯。類對象作爲參數傳遞,訪問他們自己的私有成員

+5

看起來像是堆棧溢出問題,而不是程序員Stackexchange。 – Carson63000 2011-04-09 09:22:56

回答

5

我不知道官方的理由是什麼,但在我看來,能夠訪問您自己班級的另一個對象的私有成員不會破壞封裝,也不會產生任何額外的耦合。

封裝的一點是,類A的對象不應該知道類B的對象的內部工作,以便B的實現可以改變而不影響A.但是,根據定義,類A的任何對象都知道換句話說,談論兩個不同類別之間的耦合是有意義的,但談論同一類別的兩個對象之間的耦合是沒有意義的。

在更實用的層面上,如果您無法訪問同一類的對象的私有成員,那麼您將如何實現複製構造函數?你必須爲每個私人成員設置一個訪問者,這個訪問者距離公開只有一步之遙。更不用說爲每個私人成員提供一個getter會使你的班級變得不必要的龐大而難以維護。

1

它取決於語言 - 在C#中(和C++看起來)成員對於類而不是實例是私有的。在Ruby等其他語言中,只有實例才能訪問成員。

3

private的定義表示它對類是私有的,而不是對象。該類的任何對象都可以訪問另一個類對象的成員。例如,這對於實現拷貝構造函數是非常重要的。

+0

那麼,你總是可以寫/使用訪問器,但這將是一個麻煩。 – Xeo 2011-04-09 15:32:26

+0

@Xeo,不僅如此,它還會打破訪問保護的目的。基本上,所有的數據成員都是公共可讀的。 – Dima 2011-04-09 15:42:18

+1

@Dima:哈,真夠的。人們需要區分實例私有和類私有......多麼麻煩。 :P – Xeo 2011-04-09 15:43:51