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