c++上带有公共访问器的私有字段

private field with public accessor on c++

本文关键字:字段 访问 c++      更新时间:2023-10-16

对不起,这个问题可能太简单了,我是c++新手。我应该如何实现int字段只能在类内修改,但有公共访问器?

在c#中我们可以写这样简单的代码:
public int MsgSeqNum { get; private set; }

在c++中,我应该这样写(伪代码):

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

这是正确的做法吗?GetMsgSeqNum会被内联吗?我应该手动标记方法为inline吗?添加这个方法调用时是否会引入延迟?

这是正确的做法吗?

是的,它是通过你应该标记函数返回参数为const

int GetMsgSeqNum()const { return msgSeqNum; };  

正如在注释中提到的,const不允许你修改对象,因此如果你需要这样做,你应该让getter非const,或者在你仍然是const的getter中声明你要改变的成员为mutable

将GetMsgSeqNum内联?

很可能是,在类声明中定义的任何函数都具有隐式内联。无论显式还是隐式,Thru inline都不能保证函数将被内联。

添加此方法调用时是否引入延迟?

很可能不会,任何一个编译器实现都会优化这样的调用。

这是C++中唯一合理的方法…你可以试试

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

但是你不能强迫编译器坚持使用inline。编译器决定是否inline这个方法。如果编译器没有内联该方法,也不会造成严重的性能损失,所以不用担心。

在MSVC中,有__forceinline -关键字,你可以强制编译器内联你的方法,但与getter和setter一样,这可能有点过分。

参见维基百科