2011-10-29 83 views
1

全部。我是新來的C++,我想問一個關於分配對象的問題。C++當分配一個私人對象

例如 我有2個對象來自同一類,a1和a2。 如果在班上有一些私人成員

爲什麼我們可以做這樣的任務 a1 = a2;

我的問題是,我以爲只有成員函數有權限 才能更改私有成員數據的內容,但通過步驟 我剛纔經過,私有成員數據很容易改變。 這是爲什麼?

+0

謝謝你們! 我想我明白了 – CLH

回答

2

你說得對。但是在你列出的情況下,你可以調用a1的成員函數。公衆會員功能YourClass& operator=(const <YourClass>& rightHandSide)具體。如果你沒有自己提供,編譯器會自動生成這樣的方法。如果你想阻止編譯器生成一個並嚴格按照上面描述的方式不希望分配,只需聲明operator=私有,並且根本不提供定義。這會導致編譯器在a1 = a2處抱怨。

另一件令人困惑的事情是,問題operator=可以讀取rhs的私有數據的方法。這正是Luchian Grigore所概述的:他們對班級是私人的,而不是這個例子。

5

可以使用operator=成員函數執行賦值,該成員函數根據定義可以訪問私有成員。

如果您沒有定義一個,則會提供一個默認值:「默認版本執行成員複製,其中每個成員都由其自己的複製賦值運算符複製(也可能是程序員聲明或編譯器生成的) 「。見this

2

調用者不知道什麼是被複制的,除了「對象」。來電者根本不知道有任何私人成員。 賦值運算符是公共的,其行爲對於任何公共方法都是相同的 - 公共方法當然可以修改私有成員。

2

私有成員和方法僅限於該類,而不是特定的實例。您可以從同一個類的對象訪問不同類實例中的私有成員。這種行爲是有目的的,並且由標準保證。

如果您尚未覆蓋賦值運算符(A& A::operator = (const A& other)),那麼最有可能進行淺拷貝。

0

a1 = a2;在這種情況下,將調用a1對象(即目標對象)的隱式「複製賦值運算符」,該對象是公開的並存在於a1和a2中。 「複製賦值操作符」的作業是將所有數據成員從一個對象複製到另一個對象。