我讀過社區維基quetion有關3 different conventions for accessor methods並supmetwhat驚訝沒有看到以下約定:C++訪問器缺少約定嗎?
const unsigned& amount() const { return _amount; }
unsigned& amount() { return _amount; }
真實的,它不太一樣無縫銜接,能完全避免括號() - (我覺得)是想法 - 但它仍然是一些東西;對?
我讀過社區維基quetion有關3 different conventions for accessor methods並supmetwhat驚訝沒有看到以下約定:C++訪問器缺少約定嗎?
const unsigned& amount() const { return _amount; }
unsigned& amount() { return _amount; }
真實的,它不太一樣無縫銜接,能完全避免括號() - (我覺得)是想法 - 但它仍然是一些東西;對?
它擊敗了訪問者的目的。如果您提供了兩個 函數,那麼您最好使數據成員公開,並使用 完成它。
編輯:
只是爲了讓事情非常清楚:有是案件其中使用 一個C風格struct
是最合適的解決方案。在 這些情況下,您將數據成員公開,並且不必擔心 有關訪問者。對於具有重要行爲的班級,另一方面,您將不會擁有訪問者,或者只有極少數訪問者。對於 大部分,內部狀態是而不是直接反映在 公共接口(以及通常只讀取 的狀態)。關於你都需要存取的唯一時間是 類,其基本數據,但其必須實施跨越數據 不變,
(以及它的價值:如果數據是邏輯上的屬性 類,我用:
int amount() const { return myAmount; }
void amount(int newValue) { myAmount = newValue; }
對於不是邏輯上的屬性值的干將,但是 ,我將使用getAmount()
)
你例子中的第二個給人以原始的用戶訪問。,沒有任何形式的保護。 「封裝」是OOP的一個重要方面,其目的是確保所有對變量的訪問都是在類中完成的 - 這樣類可以控制值範圍或其他有效性。
如果您希望課程透明地允許用戶使用amount
,那麼請將其稱爲amount
並將其公開。那時就不需要訪問器函數。
這樣做的問題是它可以打敗getter/setter慣例的目的。如果您將可變引用傳遞給私有成員,則不妨公開該成員並消除函數調用的麻煩。
另外,我發現這種語法很醜陋,無法讀取,但是這是我個人的口味:
foo.amount() = 23;
+1 - A-MEN!公共數據成員的罪惡被極大地誇大了。 –
@JohnDibling它取決於上下文。在實踐中,我發現我確實有很多類,只是結構,所有數據成員都是公開的。還有一些沒有公共數據成員的人。 –
訪問者至少可以更輕鬆地在稍後切換到複雜的getter和setter。 –