2013-04-23 128 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