2013-02-27 142 views
4

我在我們的使用C++的信號類中有這個項目。我跟我們的教官代碼修修補補,當我看到這一點:C++私有成員可訪問嗎?

ListData::ListData(const ListData& newlist) 
    : Data(), nbNodes(newlist.nbNodes) {} 

這是一個「拷貝構造函數」,他說,應該是大致等同於以下內容:

ListData::ListData(const ListData& newlist){ 
    Data = ""; 
    //copy nbNodes of newList to current instance 
    nbNodes = newlist.nbNodes; 
} 

但讓我困擾是nbNodes是私人會員。 如果它是私密的,這個構造函數如何訪問通過的newListnbNodes

+0

你總是你自己最好的朋友:http://stackoverflow.com/a/437507/14065 – 2013-02-27 15:38:48

回答

7

有關私人成員的一個有趣的事情是,兩個相同類型的對象可以自由訪問其他私人成員。你可以把它想象成一個班級永遠是朋友。由於這是ListDatanewlist的構造函數也是ListData,所以您可以訪問它的私有就好了。

Here's an example of this

#include <iostream> 

class foo 
{ 
    public: 
    foo() { } 
    foo(std::string secret) : secret(secret) { } 
    void steal_secret(const foo& other) { secret = other.secret; } 
    std::string get_secret() { return secret; } 
    private: 
    std::string secret; 
}; 

int main() { 
    foo f1("I'm actually a bar"); 
    foo f2; 
    f2.steal_secret(f1); 
    std::cout << f2.get_secret() << std::endl; 
    return 0; 
} 

f2愉快和輕鬆搶斷f1secret,儘管它是私有的。

這個被允許的原因很簡單,因爲private並不意味着私人對象 - 它意味着私人的類。這簡化了複製構造函數等功能的實現,這些構造函數需要對同一類的兩個對象的內部進行一些工作。

規則來源於private定義(§11/ 1):

一個類的一個成員可以是

  • private;也就是說,它的名字只能由宣稱的類的成員和朋友使用。
  • [...]

注意,它是在類的術語,而不是對象來定義。

+0

+1,我喜歡那個「朋友與自己」的比喻。 – juanchopanza 2013-02-27 14:31:46

+0

>>'同一類型的兩個對象可以自由地訪問其他私人成員'這個說法對我來說似乎不正確。 – 2013-02-27 14:43:15

+0

更好的說法是,一個班級的所有對象都是彼此的朋友。班級不需要與自己成爲朋友。 – user93353 2013-02-27 14:43:32

5

private關鍵字具有類語義而不是對象語義。因此,類的對象的私有成員可以被同一類的其他對象訪問。

3

nbNodes對於ListData是私有的,而不是針對該類的特定實例。因此,在類的代碼中,您可以看到該類其他實例的私有數據。

如果不是這樣,每個類都必須爲每個數據成員導出「getters」以執行復制構建和複製分配。

1

會員有private能見度是隻能成員函數相同類它們的成員的內上對象訪問,而不限制構件。

如果功能f()C類的成員函數,它可以訪問的private構件C任何實例,而不僅僅是那些由隱this指針(其中,當然,使得該有效static功能指出以及根本沒有收到this指針)。

1

複製構造函數就像任何其他方法一樣:因爲您可以從該類的方法訪問類的私有成員,所以您可以對複製構造函數執行相同的操作(否則,您如何複製實例到另一個類?)。

1

從C++標準,第11章:成員訪問控制:

私人;也就是說,它的名字只能由其所在類的成員和朋友使用。

這意味着私有成員可以通過該類

這裏ListData::ListData(const ListData& newlist)的任何成員訪問是的ListData,這是一個成員函數,從而可以訪問類的ListData的私有成員的拷貝構造函數。