在 C++ 中返回可修改引用的 const getter 有意义吗?

Does a const getter returning a modifiable reference in C++ make sense?

下面的getter有意义吗?

MyType& MyClass::getMyType() const { return mMyType; }

我不修改 this 但我允许其他人修改它。 有什么要避免的吗?

我的 IDE 生成 getter 的方式如下:

MyType       & MyClass::getMyType()       { return mMyType; }
MyType const & MyClass::getMyType() const { return mMyType; }

好点了吗?我不需要常量版本

对我来说,不是。

MyType       & MyClass::getMyType()       { return mMyType; }
MyType const & MyClass::getMyType() const { return mMyType; }

破坏了封装。

封装意味着如果你想修改一个数据成员,你必须显式地调用一个函数,比如setter,它允许你做修改。但是,在您的代码中,obj.getMyType() 可以或不能修改数据成员。所以对我来说这就像将 mMyType 设置为 public.

我不会碰const版本getMyType()但我会删除非const版本并添加一些新功能,例如void setMember1OfMyType(...)void setMember2OfMyType(...)

const 是可传递的。如果是其他方式就没有意义了。

您的版本的一般情况不是合法的 C++,因为在 const 方法中,所有数据成员都被视为 const。为了能够像那样分发 mMyType 它必须符合 mutable.

I don't need the const version

如果您持有对 MyClass 的 const 引用,则需要它,例如如果它们曾经是 std::set 的元素或 std::map 的键,或者您想编写一个可以用左值或右值调用的函数。

然而,更简单的选择是让 mMyType public,因为 public 可变 getter 让任何人都可以为所欲为。

MyClass myClass;
myClass.getMyType() = MyType(args...); // It's a setter too!

is the following getter make sense?

MyType& MyClass::getMyType() const { return mMyType; }

这是有道理的。不一定有道理。

Is it something to avoid?

经常,是的。但并非总是如此。

MyType       & MyClass::getMyType()       { return mMyType; }
MyType const & MyClass::getMyType() const { return mMyType; }

is it better?

经常,是的。但并不总是

归结为函数的作用。如果您 return 引用一个成员,那么 const 应该是可传递的,并且引用的常量应该匹配 *this 的常量。在这种情况下,您会发现建议的 getter 格式不正确。但是,如果您认为需要提供非常量引用 getter,那么请考虑改为使用成员 public。

如果函数表示间接,那么引用的常量和 *this 的常量应该分开。

传递性 const 通常更容易理解,而非传递性 const 更容易出错,初学者也更难理解。

我的一般建议是,不要提供 returns 的 getter 参考,而是将字段设为 public。你达到了同样的效果,而且更干净。