2013-04-23 209 views
0

對不起,可能太簡單的問題,我是新手在c + +。我應該如何實現int字段,該字段只能在類中修改,但具有公共訪問器?私人領域與公共accessor在c + +

在C#中,我們可以這樣寫簡單的代碼:

public int MsgSeqNum { get; private set; } 

在C++中,我應該會寫類似的東西(僞代碼):

public: 
    int GetMsgSeqNum() { return msgSeqNum; }; 
private: 
    int msgSeqNum; 

它是做事的正確方法?將GetMsgSeqNum內聯?我應該手動將方法標記爲inline?我是否會引入延遲添加此方法調用?

+2

我不擔心它。對你的編譯器有一定的信心,但是如果你願意的話,可以自由地使它成爲「內聯int GetMsgSeqNum」。 – 2013-04-23 11:41:50

+0

如果它對客戶是隻讀的,那麼就像你一樣,不要提供setter。如果它有複雜的邏輯或者需要警衛來檢查輸入(你的例子並不是一個int),那麼也提供一個私有集合方法,並在內部使用它。 – wmorrison365 2013-04-23 11:43:13

+0

@JamesMcLaughlin這裏沒有必要使用inine,7.1。2函數說明符'在類定義中定義的函數是一種內聯函數。「C++ 11標準,它和之前一樣。 – alexrider 2013-04-23 12:05:01

回答

2

這是C++做到這一點的唯一理智方式......你可以試試

public: 
    inline int GetMsgSeqNum() const { return msgSeqNum; } //const -> doesn't change object 

但你不能強迫編譯器堅持inline。編譯器決定是否要inline這個方法。如果編譯器不內聯該方法,則不會有嚴重的性能損失,所以不用擔心。

在MSVC中有__forceinline -keyword,你可以強制編譯器內聯你的方法,但是對於getter和setter來說,這可能有點超出邊界。

請參閱Wikipedia對此。

+0

唯一的理智之道......爲什麼我會有一個「朋友」功能作爲吸氣劑? – 2013-04-23 11:56:51

+0

我同意,但它沒有任何意義,至少對我來說...... – 2013-04-23 11:58:10

7

它是做事的正確方法嗎?

是的,它是直通你應該標註函數返回參數作爲const

int GetMsgSeqNum()const { return msgSeqNum; }; 

正如評論meintioned,const不會允許你修改的對象,因此,如果您需要的話,您應該使得getter非常量,或者宣佈你的stil const獲取器中要更改的成員爲mutable

將GetMsgSeqNum內聯?

很可能是的,任何在類聲明中定義的函數都有隱式內聯。直接內聯無論明示還是暗示都不保證該函數將被內聯。

我是否引入延遲添加此方法調用?

很可能沒有,任何理智的編譯器實現都會優化這樣的調用。

+0

僅僅因爲函數返回一個值並不意味着它應該是const。一個函數可以修改對象的內部狀態並仍然返回一個值。 – 2013-04-23 11:55:49

+0

@CaptainObvlious我認爲這只是措辭不良,他可能是因爲它是一個訪問器(與mutator相對),它應該是const。它肯定可以通過重寫來實現,因爲它是不明確的 - 可以解釋爲「返回參數爲const」,因爲返回值是const。 – JBentley 2013-04-23 11:59:47

+0

@JBentley正在思考同樣的事情。想象一下,在我放下編輯之前,我會給它一些。 – 2013-04-23 12:01:01