c++ - 对类成员而不是 getter 的 Const 引用

标签 c++ c++11 reference

获取类成员或其值的引用的经典方法是使用 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)数据成员firstsecond 。这意味着所有用户特化必须遵守相同的规范,并且不能轻易地采用基本布局优化之类的东西。有firstsecond被指定为成员函数,这样的优化可以很简单地应用。

关于c++ - 对类成员而不是 getter 的 Const 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43392033/

相关文章:

C++ "Dynamic"C 回调函数的函数指针

c++ - 如何解压空的可变参数模板列表

c++ - 如何使用 auto 声明数组

设置 View 标签时Android GRef增加

c# - 在哪里添加 System.Windows.Media.GradientStopCollection 的引用

c++ - 在 main 中将 istream 定义为全局变量

c# - 从 C# 中的 C++ dll 声明其返回值是 2 点的函数?

c++ - Eclipse C++ 包含错误 : no such file or directory

c++ - 一些 CPU 信息

c++ - 如何创建函数指针数组?