私人领域与公共accessor在c + +
对不起,可能太简单的问题,我是新手在c + +。我应该如何实现int
字段,该字段只能在类中修改,但具有公共访问器?私人领域与公共accessor在c + +
在C#中,我们可以这样写简单的代码:
public int MsgSeqNum { get; private set; }
在C++中,我应该会写类似的东西(伪代码):
public:
int GetMsgSeqNum() { return msgSeqNum; };
private:
int msgSeqNum;
它是做事的正确方法?将GetMsgSeqNum
内联?我应该手动将方法标记为inline
?我是否会引入延迟添加此方法调用?
这是C++
做到这一点的唯一理智方式......你可以试试
public:
inline int GetMsgSeqNum() const { return msgSeqNum; } //const -> doesn't change object
但你不能强迫编译器坚持inline
。编译器决定是否要inline
这个方法。如果编译器不内联该方法,则不会有严重的性能损失,所以不用担心。
在MSVC中有__forceinline
-keyword,你可以强制编译器内联你的方法,但是对于getter和setter来说,这可能有点超出边界。
请参阅Wikipedia对此。
唯一的理智之道......为什么我会有一个“朋友”功能作为吸气剂? – 2013-04-23 11:56:51
我同意,但它没有任何意义,至少对我来说...... – 2013-04-23 11:58:10
它是做事的正确方法吗?
是的,它是直通你应该标注函数返回参数作为const
int GetMsgSeqNum()const { return msgSeqNum; };
正如评论meintioned,const
不会允许你修改的对象,因此,如果您需要的话,您应该使得getter非常量,或者宣布你的stil const
获取器中要更改的成员为mutable
。
将GetMsgSeqNum内联?
很可能是的,任何在类声明中定义的函数都有隐式内联。直接内联无论明示还是暗示都不保证该函数将被内联。
我是否引入延迟添加此方法调用?
很可能没有,任何理智的编译器实现都会优化这样的调用。
仅仅因为函数返回一个值并不意味着它应该是const。一个函数可以修改对象的内部状态并仍然返回一个值。 – 2013-04-23 11:55:49
@CaptainObvlious我认为这只是措辞不良,他可能是因为它是一个访问器(与mutator相对),它应该是const。它肯定可以通过重写来实现,因为它是不明确的 - 可以解释为“返回参数为const”,因为返回值是const。 – JBentley 2013-04-23 11:59:47
@JBentley正在思考同样的事情。想象一下,在我放下编辑之前,我会给它一些。 – 2013-04-23 12:01:01
我不担心它。对你的编译器有一定的信心,但是如果你愿意的话,可以自由地使它成为“内联int GetMsgSeqNum”。 – 2013-04-23 11:41:50
如果它对客户是只读的,那么就像你一样,不要提供setter。如果它有复杂的逻辑或者需要警卫来检查输入(你的例子并不是一个int),那么也提供一个私有集合方法,并在内部使用它。 – wmorrison365 2013-04-23 11:43:13
@JamesMcLaughlin这里没有必要使用inine,7.1。2函数说明符'在类定义中定义的函数是一种内联函数。“C++ 11标准,它和之前一样。 – alexrider 2013-04-23 12:05:01