【问题标题】:Get and Set Function vs Referenced Functions获取和设置函数与引用函数
【发布时间】:2013-04-27 12:06:21
【问题描述】:

我有这个代码:

#include<iostream>
#include<string>

class Test
{
public:
    std::string& GetText()
    {
        return text;
    }

    void Display() { std::cout << text << std::endl; }

private: 
    std::string text;
};

int main()
{
    Test test;

    test.GetText() = "Testing";
    test.Display();
}

现在这个引用函数就像一个函数名下的 get 和 setter 一样工作。所以我想知道使用这种方法是否有益,或者使用单独的 get 和 set 方法是否更有益。或者将变量公开是否更有意义。

【问题讨论】:

  • 让函数返回对成员变量的引用是可以的,但命名可能并不完美(恕我直言),因为您可以使用“get”函数来“设置”一个值。

标签: c++ methods properties get set


【解决方案1】:

两个版本在性能、行为等方面没有区别(或至少没有太大区别)。但是对于参考版本,还有其他一些事情需要记住:

  1. 您只能返回对对象实际成员的引用。如果没有这样的成员,你就迷路了。此外,提供引用意味着给出实现的提示,从而泄露了类应该提供的抽象。这也使得改变实现变得困难。考虑使用 x 和 y 坐标实现的类 Point。您将无法提供对点的极坐标表示的引用访问,也无法轻松将实现更改为极坐标,因为此后引用 getX()getY() 访问器将不起作用更多。
  2. 您将需要一个 const 版本和一个非常量版本,因此您有 2 种方法而不是 2 种方法 - 编写参考版本没有任何节省。
  3. 您不能应用边界检查,例如对于极坐标,phi 必须介于 02*pi 之间。您无法自救,例如p.phi() = 2500.4;
  4. 你总会有一个吸气剂。有时在某些情况下只需要一个 setter。不可能只有参考版本的设置器。并且对仅限 setter 的成员使用简单的 setter 方法,但任何其他成员的引用访问权限会不一致,并且会使阅读您代码的任何人感到困惑。

因此,虽然在某些情况下,引用的访问很有用,但您应该在大多数情况下使用经典的 getter 和 setter 方法。

【讨论】:

  • 对于项目没有“真实”后备存储的场景,返回一个其构造函数将适当数据复制到临时后备存储并可转换为对该类型的引用的对象是否合理? ,以及谁的析构函数将后备存储复制回底层对象,或者在引用仍然存在时可以调用析构函数?
猜你喜欢
  • 1970-01-01
  • 2011-10-09
  • 2015-12-23
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
  • 2015-10-20
  • 1970-01-01
相关资源
最近更新 更多