获取类成员或其值的引用的经典方法是使用 getter,例如 getValue()
。这可以是另一种方式吗? :
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_;
}
我问这个问题是因为我在使用一个编译器时遇到了一些麻烦。
最佳答案
与数据成员相比,更喜欢成员函数的主要原因之一是灵活性和可维护性。如果您只完美地编写过一些代码一次,并且永远不会更改或重用它,那么您当然可以拥有用户直接引用的公共(public)数据成员。
有趣的问题是,当您的代码不满足这些标准时会发生什么,例如它是否会发展,以及其他人是否开始使用它。然后,一旦您拥有公共(public)数据成员,您就被迫始终拥有该数据成员。您的类(class)布局的详细信息现在是您公共(public)契约(Contract)的一部分。简单的重构(例如将公共(public)部分移动到嵌套成员对象中)不再是私有(private)的,并且会破坏现有用户。
您建议的引用数据成员几乎没有比公共(public)数据成员增加任何好处(除了非常简单的情况),并且与成员函数不同,非静态数据成员会影响类布局。一旦有了用户,类布局是您可能希望保持稳定的另一件事,以便旧的编译库可以继续与新的用户代码链接。在保持数据布局不变的情况下,成员函数更容易发展。
标准库中有一个很好的例子,其中犯了这样的错误:std::pair<T1, T2>
指定为包含公共(public)数据成员first
和second
。这意味着所有用户特化必须遵守相同的规范,并且不能轻易地采用基本布局优化之类的东西。有first
和second
被指定为成员函数,这样的优化可以很简单地应用。
关于c++ - 对类成员而不是 getter 的 Const 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43392033/