Const引用类成员而不是getter

时间:2017-04-13 12:12:54

标签: c++ c++11 reference

获取类成员或其值的引用的经典方法我们使用getValue()之类的getter。这可能是一种替代方式吗? :

class A{
  ComplexClass value_;
public:
  //No need. ComplexClass const& getValue() const { return value_; }
  ComplexClass const& value = value_;   /// ???
}

这会有用吗?你觉得这样的语法怎么样?

UPD。 这一点是为了使用户代码更简单。我个人更喜欢auto x = a.value而不是auto x = a.getValue()当然这是一种品味。

如果符合以下条件,这仍然有用吗

class A{
public:
  ComplexClass const& value = value_;
protected:
  ComplexClass value_;
}

我问,因为我遇到了一个编译器的麻烦。

1 个答案:

答案 0 :(得分:4)

优先选择成员函数而不是数据成员的主要原因之一是灵活性和可维护性。如果您只编写过一次完美的代码,并且它永远不会被更改或重用,那么您当然可以拥有用户直接引用的公共数据成员。

有趣的问题是当您的代码不符合这些条件时会发生什么,例如:如果它会发展,如果其他人开始使用它。然后,一旦有了公共数据成员,就必须始终拥有该数据成员。您班级布局的详细信息现在是您的公共合同的一部分。将公共部分移动到嵌套成员对象中的简单重构不再是私有的,并且会破坏现有用户。

您建议的参考数据成员几乎没有增加公共数据成员的好处(除了非常简单的情况),并且与成员函数不同,非静态数据成员会影响类布局。类布局是您可能希望在拥有用户后保持稳定的另一个方面,以便旧的已编译库可以继续链接到新用户代码。在保持数据布局不变的情况下,成员函数更容易发展。

标准库中有一个很好的例子,出现了这样的错误:std::pair<T1, T2>被指定为包含公共数据成员firstsecond。这意味着所有用户专业化必须遵守相同的规范,并且不能轻易地使用基本布局优化等内容。如果firstsecond被指定为成员函数,则可以简单地应用此类优化。

相关问题