精華區beta CompBook 關於我們 聯絡資訊
C++ Primer 答客問 (6) 侯捷 jjhou@ccca.nctu.edu.tw 1999.10.11 第一次發表於 清大.楓橋驛站(140.114.87.5).電腦書訊版(Computer/CompBook) 本文將於日後整理於 侯捷網站/侯捷譯作/C++ Primer 中文版/答客問 侯捷網站:www.jjhou.com ---------------------------------------------------------------- sbb wrote (1999/10/11) > Dear 侯老師: > 在您譯的c++ primer第627頁13.3.2節中, > 曾經提到copy() 這個函式中為什麼能取用 > 外傳進來的private data member 的問題, > 說會在後一節中有詳細介紹, 但我念完後一 > 節後, 問題在是在耶 ? 就如同下面那個範例 > 是大部分c++教課書中所使用的, 但為什麼 > void add_dist這個函式可以直接使用外傳進來 > d2 的private data member 如 d2.inches 呢 ? > 這樣不就違反了"encapsulate"的規則了嗎 ? > 還有就是能不能請問您 private member 真正 > 的定義呢? 您在書中只提到只能夠被member functions 存取, > 或是被其class 的 friends存取 . 但這是一般情況, > 若是外傳進來的同一種class的不同object,為什麼可以取得呢? > 而且我試過各種c++ compier都可以compile耶. > > 煩請您幫學生解決, 這問題己經困援學生多年, > 只有您這本書有提到這個問題, 但是學生 > 對於答案還是有點疑問, 謝謝. > > 學生 sbb > > class Distance > { > private: > int feet; > float inches; > public: > Distance() : feet(0), inches(0.0) > {} > Distance(int ft, float in) : feet(ft), inches(in) > {} > void add_dist(Distance d2,Distance d3) > { > inches += d2.inches + d3.inches; > feet += d2.feet + d3.feet; > } > }; > int main() > { > Distance dist1, dist3; > Distance dist2(11,6.25); > > dist3.add_dist(dist1,dist2); > return 0; > } 侯捷回覆: 你這個例子和 C++ Primer p.627, 13.3.2 節的例子類似, 那麼就拿你的例子來說好了。你問: > 為什麼 > void add_dist() 這個函式可以直接使用外傳進來 > d2 的 private data member 如 d2.inches 呢 ? > 這樣不就違反了 "encapsulate" 的規則了嗎 ? 要知道,add_dist() 是 class Distance 的 member function 呀, 它的全名是 Distance::add_dist(),它當然有權處理 class Distance 的任何 data members。這並沒有違反封裝性質,對不! > 還有就是能不能請問您 private member 真正 > 的定義呢? 您在書中只提到只能夠被member functions 存取, > 或是被其class 的 friends存取 . 但這是一般情況, > 若是外傳進來的同一種class的不同object,為什麼可以取得呢? 因為上述的 add_dist 是 class Distance 的 member function 呀。 你在 main() return 前加上一行試試: cout << dist3.feet << endl; 你會發現這一行過不了關,VC 錯誤訊息如下: C2248: 'feet' : cannot access private member declared in class 'Distance' 你看,class Distance 的 private data member "feet" 不能夠被 cout 的 operator<< 取用。 * * * * * * * * * * * * * * * * 一般人易感困惑的是,member functions 只有一份碼,為什麼卻 能夠處理隸屬同一 class 的不同 objects 內的 private data members 而不混淆。這主要是靠 'this' 指標的協助。我們從程式碼中看不出 端倪,關鍵在於編譯器暗中對程式碼做了一些手腳。請參考《多型與虛擬》 p.100「this 指標 - data members 與 member functions 的橋樑」, 或是《深入淺出 MFC》2/e p.61「this 指標」。 --- the end  -- ※ Origin: 楓橋驛站<bbs.cs.nthu.edu.tw> ◆ Mail: jjhou@ccca.nctu.edu.tw