2012-11-22 72 views
0

當我在一個類中定義一個變量時,每當我聲明這個類的一個實例時,它就會在內存中爲特定實例創建該變量的新副本。我理解這一點,但是當所有成員變量都是私有的時候,這是否適用?例如:是否爲每個類的實例實例化私有類變量?

class A { 
    int a, b, c; 
}; 

A a; 

當我創建一個新的實例,還是分配給a這些私有變量,即使他們不能在類的外部使用?

+0

是的它是正確的 – triclosan

+0

這可以在任何關於C++基礎知識的書籍或網頁中找到。 –

+0

@MarekR我的書對它的工作原理的解釋非常混亂。你可以請拿走downvote? –

回答

2

編號內存分配是一個實現細節。考慮代碼:

class A { 
    int a, b, c; 
}; 

int main() 
{ 
    A a; 
} 

有可能是不存在存儲器分配任何,因爲C++在AS-如果模型運行。意思是,如果輸出與預期的相同,編譯器可以自由地執行任何操作。包括優化出死代碼。

儘管如此,您可以假定空間已分配給對象的所有成員。

+2

給提問者一個警告:你可能要先閱讀最後一句。然後在晚些時候閱讀其餘的內容! –

+0

@sftrabbit別擔心,我明白他在說什麼。只是好奇,從來不知道這一點。 –

2

你認爲私人變量「不能從班級以外使用」是不正確的。聲明一個成員private只是意味着它不能被直接從課堂外名稱引用(當然除了班級朋友)。 「不能使用」是一個更強的斷言,這恰好是不真實的。

如果「外部世界」以某種方式獲得訪問該私有成員的替代方式,則可以不受任何限制地執行該操作。例如,您的類可能實現一個公共訪問成員函數,該函數返回綁定到私有成員的引用(或指針)。這將使該特定成員從外部間接訪問。

實際上,除了在成員名稱的級別上工作的純概念性編譯時訪問限制之外,該類的公共和私人成員之間絕對沒有區別。它是編譯器級別實現的一個非常薄的保護層。沒有任何物理背後的東西,即不管他們的保護水平如何,班級的數據成員之間沒有物理差異。

+0

沒有downvote,但這並沒有回答這個問題。 – 0x499602D2

+1

@大衛:是的,它的確如此。 「公共和私人成員絕對沒有區別......」是對這個問題的直接和直接的回答。 – AnT

+0

*這些私有變量仍然分配給'a',即使它們不能在課堂外使用嗎?*是問題。他可能有一個誤解,你可以爲他清楚,但這仍然沒有回答主要問題。 – 0x499602D2