2016-05-23 51 views
0

在試圖刷新我的C++時,我一直在試圖找出創建訪問器的最佳實踐方式。C++ const訪問器和引用最佳實踐

我想澄清我的理解,並找出我所做的是對的。我有幾個問題,但它們看起來非常簡單,所以我將它們全部引入了這個Stack Overflow問題。

以下是代表什麼我「想」是做事的正確方法是一些示例代碼:

class MyClass 
{ 
private: 
    std::string StringMember_; 
    int IntMember_; 

public: 
    MyClass(const std::string &stringInput, const int &intInput) : StringMember_(stringInput), IntMember_(intInput) 
    { 
    } 

    const std::string &StringMember() const 
    { 
     return StringMember_; 
    } 

    void StringMember(const std::string &stringInput) 
    { 
     StringMember_ = stringInput; 
    } 

    const int &IntMember() const 
    { 
     return IntMember_; 
    } 

    void IntMember(const int &intInput) 
    { 
     IntMember_ = intInput; 
    } 
}; 

我的問題是:

凡我訪問器返回const引用變量,即const std::string ,這意味着它(我的類的成員變量)不能改變。那是對的嗎?

方法的主體之前的最後const指示該方法所屬的類的成員不能改變,除非它們被指定爲mutable。這是否正確?

如果我傳遞的是const方法參數,這意味着我確保這些參數在傳入時始終保存,從而保護傳入的所有原始變量不被方法體更改。這是否正確?

關於mutable關鍵字,在什麼情況下我真的想要使用它?我一直在努力想出一個很好的場景,我需要一個需要修改類成員的const方法。

訪問者似乎是一個好主意,即使對於永遠不會公開的數據,因爲它確保了單點入口,允許更容易的調試等等。我是否在這裏考慮了正確的思路,或者這實際上完全沒有意義,並且不需要私人訪問者?

從純粹的句法角度來看,我應該寫作我的參考文獻,如const int& intInputconst int &intInput。這個符號的位置究竟在哪裏,還是僅僅是個人喜好的問題?

最後,我在上面的例子中做了什麼?我打算開始制定一個更大的個人項目,並且我希望在這些核心基礎知識之後再開始解決問題。

我用這個作爲參考:https://isocpp.org/wiki/faq/const-correctness

+0

爲什麼downvote?另外,我已經更新了標題,嘗試使它更清晰。 – Interminable

+0

我的猜測是,這是因爲你問了不止一個問題。我們傾向於每個問題提出一個問題。也就是說,除了最後一個問題以外的所有問題都是微不足道的,所以在我看來沒問題。然而,最後一個問題是,對於計算器而言,這兩者都過於寬泛且意見相左。 – user2079303

+0

我確實認爲他們對於個別問題來說過於微不足道。 至於最後一個,我主要是想知道我是否在做任何我沒有發現的錯誤。 – Interminable

回答

3

變量,即const std :: string,這意味着它(我的類的成員變量)不能改變。那是對的嗎?

正確。變量不能通過const引用進行更改。

在方法體之前的最後一個const指示該方法所屬的類的任何成員都可以被更改,除非它們被指定爲可變。這是否正確?

正確。它也允許函數在const對象上被調用。

在我傳入const方法參數的地方,這意味着我確保這些參數在傳入時始終保存,從而保護傳入的所有原始變量不被方法體改變。這是否正確?

正確。接受價值論據也可以達到同樣的效果。

關於mutable關鍵字,在什麼情況下我真的想要使用它?

When have you used C++ 'mutable' keyword?

訪問器似乎是一個好主意,甚至永遠不會被公開曝光的數據,因爲它可以確保一個入口點,允許更容易調試等工作。我是否在這裏考慮右行

我不買這個說法。 Watchpoints允許輕鬆調試成員變量,無論它們從哪裏訪問。

從純語法的角度來看,我應該寫喜歡const int的& intInput或const int的& intInput我引用。

兩者在語法上是等同的,它們之間的選擇純粹是美學的。

最後,我在上面的例子中做了什麼好習慣?

沒有一般的答案。訪問器有時很有用。通常他們是多餘的。如果你提供了一個允許直接設置值的函數,比如你在這裏執行的操作,那麼你也可以擺脫訪問器並且公開成員。

+0

Upvoted針對訪問者的立場。 – SergeyA

+0

標記爲答案,因爲您在處理我問的所有問題時都​​有很好的解決方案! 儘管(我的調試點只是一個例子),但我仍然沒有完全銷售反訪問者的想法。 我從來沒有習慣使用它們,但有一種方法來控制成員數據的接入點對我來說似乎很好,因爲如果您需要添加檢查以設置成員數據的值,則不會有一個訪問者有意義? – Interminable

+1

@不好意思,如果你的設計改變了,並且你後來想要阻止直接分配來支持檢查的方法,我無法反駁你沒有給出的私人界面的參數:),這可能不是問題更改可見性,添加訪問器並修改代碼以使用它。在公共API的情況下,你的論點是有效的。 – user2079303

0

我看來,像你對這裏的概念相當不錯的手柄。至於mutable的例子有很多,這裏有一個:你有一個搜索方法,出於性能方面的原因,你緩存最後的搜索結果......內部緩存對於const搜索方法需要是可變的。即外部行爲沒有改變,但內部的東西可能會改變。

0

這裏是mutable一些例子:

memoiziation高速緩存,用於當某事是referencially透明的, 但昂貴的計算,到第(const限定) 存取所述第一呼叫計算值和將其存儲在可變成員散列表 表中,第二次和後續調用取而代之從表 中取值。

訪問計數器,定時,記錄儀和其他儀器需要 凡我訪問器返回一個const引用改變一些狀態,當一個常量限定的訪問被稱爲

https://www.quora.com/When-should-I-actually-use-a-mutable-keyword-in-C++