在 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。你达到了同样的效果,而且更干净。
下面的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。你达到了同样的效果,而且更干净。