2011-03-08 53 views
0

在書中的C++編程語言,作者聲稱,對於下面的類設計,的成員函數的設計問題的類複雜

class complex{ 
    double re, im; 
public: 
    double real() const { return re;} 
    double imag() const { return im;} 

}; 

鑑於實()和IMAG() ,我們可以定義各種有用的操作符,而不用直接訪問複雜表示。

如何理解此聲明?我們需要直接進入的地方以及我們需要間接進入的地方?

作者還給出了下面的例子。

inline bool operator==(complex a, complex b) 
{ 
    return a.real()==b.real() && a.imag() ==b.imag(); 
} 

這個給出的例子與上面給出的作者的陳述有什麼關係。

+0

什麼書?請編輯。 – 2011-03-08 15:19:08

+4

這是一個不好的例子(這表明它也可能是一本不好的書) - 你不應該使用'=='來測試浮點值是否相等。 – 2011-03-08 15:21:42

+0

@保羅 - 哼?如何測試兩個'double's是否相等? – 2011-03-08 15:24:23

回答

0

由於operator==是一個免費的功能,它甚至不是類的friend,所以它不能接取類的私有成員,但它可以訪問的complex公共成員函數,因此它可以幫助實現operator==的公共成員職能。這就是作者的意思。這也是作者data encapsulation的一個很好的演示!

順便提一下,實施可進一步通過定義改進,

inline bool operator==(const complex & a,const complex & b) //note difference! 
{ 
    return a.real()==b.real() && a.imag() ==b.imag(); 
} 

請注意參數:現在,他們正在定義爲參考避免不必要副本!

0

這是相關的,你不直接訪問reim,而是通過訪問函數real()imag()訪問它們。

如果該功能將被寫成這樣:

return a.re==b.re && a.im==b.im; 

那麼它必須是一個朋友的功能(需要訪問私有成員)。

1

作者在這裏所說的內容被稱爲「封裝」。定義「==」的新函數定義了用於比較新類型(複數)的兩個對象的邏輯,而不必知道複數的內部實際是什麼樣子。

你的問題確實含糊不清,所以我認爲你想要做的是學習更多關於「面向對象編程」和「封裝」的知識。谷歌搜索這些條款應該有所幫助。

實際上,this可能是一個很好的開始。

0

作者正在試圖說明不暴露類complex的實際實施細節的優勢。在任何時候,您都可以更改實際的底層實現,而無需更改任何其他代碼,只要這兩種方法始終能夠滿足用戶的期望即可。

0

這意味着,您不提供對Complex的真實成員的訪問權限,因爲reim是私有的,並且getters(訪問者)返回值的副本。這就是所謂的封裝。

該示例顯示如何比較2 Complex對象,而不觸摸私有數據成員。 (否則,如果你公開發布reim,任何人都可以隨時更改它,這破壞了OOP的主要目標之一 - 正如我所說的封裝)。

0

operator==檢查是否兩個複數是通過它們的real/imag接口相等,而不直接接觸reim成員。

這意味着

  1. 函數接收complex &不能改變的成員,因爲它們是有效const(只到達過const存取),以及
  2. 以後可以改變complex類存儲號碼polar form,而不會破壞除realimag成員之外的任何內容。

這被稱爲「封裝」或「數據隱藏」。

+0

嗯,實際上你可以通過創建一個新的複雜值並賦值來改變一個複雜的參數。:-) – 2011-03-08 16:35:29

+0

@Bo:是的。我的意思是你不能單獨改變成員*。 – 2011-03-08 16:37:34