2012-08-30 63 views
0

假設我有下面的類:混淆拷貝構造函數和私有成員

class Test 
{ 
      int num; 
    public: 
      Test(int x):num(x){} 
      Test(const Test &rhs):num(rhs.num+1){} 
}; 

int main() 
{ 
     Test test(10); 
     Test copy = test; 
} 

在副本中num應該是11,我的問題是關於拷貝構造函數裏面,爲什麼我們訪問私有成員numtest使用num初始化num的副本?令我困惑的是,如果你輸入cout<<test.num<<endl,當然這是錯誤的,因爲你試圖訪問專用num,但如果你通過引用複製構造函數來通過測試,它的工作原理,任何人都可以告訴我這裏發生了什麼?

+0

,讓我感到困惑的是,如果你輸入類似「cout << test.num << endl」,當然這是錯誤的,因爲你想訪問私人號碼,但是如果你通過參考拷貝來通過測試構造函數,它的工作原理,任何人都可以告訴我whay在這裏發生,因爲我的英語不是很好,我希望你們能理解我在說什麼 – user1629199

+0

你的英語不是很好,但足以說明問題。如果你問我,我會盡量縮短句子,避免多次重複。另外,當在問題中編寫代碼時,用反勾號將其包括起來,將其格式化爲代碼並轉義(避免解析器將

+0

感謝您的建議,我試圖提高我的英語和學習一切 – user1629199

回答

5

私人成員對於班級本身是私人的,而不是班級的實例。

3

訪問限制是每類,而不是每個對象。

「私人」是指 - 只能在同一個班級內進行訪問。

「受保護」是指 - 可以從同一個類內訪問,也可以從派生類內訪問(在派生類中,受保護的非靜態成員只能通過派生類類型的變量訪問) 。

「公共」的意思是 - 可以被任何東西訪問。

訪問限制點是限制必須檢查的代碼區域,以便了解使用值的位置,而不是停止使用值的代碼。

1

private並不意味着私有的對象實例。這意味着私密的。類T的一個實例可以訪問其他實例的私有成員T。同樣,類T中的靜態方法可以訪問T實例的私有成員。

如果private限制對單個實例的訪問,它將使對象不可複製,因爲正如您所指出的那樣,複製構造函數將無法從原始實例中讀取數據。