2012-10-25 102 views
0

假設有必要實施getter/setters(我也試圖儘可能避免它們,因爲它們經常表示設計不好)。以下兩種哪種變體更好,每種變體的含義是什麼?什麼是getter方法的推薦簽名?

可能性(1):

class Foo; 
class Bar 
{ 
public: 
    const Foo& getFoo() const {return foo_;} 
private: 
    Foo foo_; 
}; 

或(2):

class Foo; 
class Bar 
{ 
public: 
    void getFoo(Foo& foo) const {foo = foo_} 
private: 
    Foo foo_; 
}; 

就個人而言,我總是使用第一種變體,因爲我覺得這樣更直觀。在第二個變體中,您必須在調用getFoo之前​​構造Foo對象,該對象將保存getFoo的結果,然後將getFoo傳遞給此對象的引用。這個變體對我來說感覺是違反直覺的,但是有些人更喜歡secodn變體。出於什麼原因,第二個變體可能會優於第一個變體?

+11

我打算說一聲「沒有」。你有沒有考慮過'Foo const&getFoo()const'? –

+1

如果您想要第二個版本w.r.t的行爲,請添加到'Foo&getFoo()'中。你的引用的可變性(注意,技術上你的2不是'const'-conformant,你將不得不應用這個技巧)。 –

+1

我是唯一一個迷惑於吸氣劑和二道手指示不良設計的人嗎? – Mitch

回答

7

輸出參數應被視爲刑事犯罪。使用起來更加困難,但特別難以維護,因爲它在代碼中不可見。如果分配了某些東西,則很明顯。如果一個方法在對象上被調用,它可能會修改它。但是如果只傳遞給一個函數,普通維護程序員不會懷疑它正在被修改。另外大部分時間需要額外的線路來聲明臨時變量來接受值。

這種事情主要是由停在C89的人以及以某種方式學習C++語法的人寫的。但是使用C++ copy elision和移動C++ 11的語義,我沒有看到任何有效的理由值得讓代碼更難閱讀。

當然,如果你要返回一個成員,你可以返回const引用。如果計算該值,則只需按值返回,複製elision將在大多數時間處理它。

0

第一種變體當然在一般情況下是優選的。由於返回值優化(RVO),它的效率並不比秒低,因爲不會複製返回的對象,並且不存在性能開銷。

如果您需要對傳遞的對象進行一些初步設置或使用部分副本,則可以使用第二種方法。但是,這不是一個微不足道的getter,當然,但是具有不同語義的一些不同的功能。

使用第二個變體的另一個可能的原因 - 當傳遞的對象不能由持有類直接創建時,例如,它的創作由一些工廠封裝,你不想讓你的課程依賴於這個工廠。

0
const Foo& getFoo() const {return foo_;} 
相關問題