获取和设置函数与引用函数

Get and Set Function vs Referenced Functions

本文关键字:函数 引用 设置 获取      更新时间:2023-10-16

我有这样的代码:

#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方法更有益。还是把变量设为公共更有意义。

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

  1. 只能返回对对象的实际成员的引用。如果没有这样的成员,你就输了。此外,提供引用意味着给出关于实现的提示,从而泄漏类应该提供的抽象。这也使得改变实现变得困难。考虑用x和y坐标实现的类Point。您将无法提供对点的极坐标表示的引用访问,也无法轻松地将实现更改为极坐标,因为在此之后,引用getX()getY()访问器将不再工作。
  2. 你将需要一个const和一个非const版本,所以你有两个方法对两个方法-没有节省编写参考版本。
  3. 您不能应用边界检查,例如phi必须在02*pi之间的极坐标。你无法避免像p.phi() = 2500.4;
  4. 这样的情况。
  5. 你将永远有一个getter。有时只需要setter。不可能只有参考版本的setter。对于只使用setter的成员使用一个简单的setter方法,但是对任何其他成员使用引用访问将是不一致的,并且会使任何阅读你的代码的人感到困惑。

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