返回引用和直接修改 class 的区别?

Difference between returning a reference and modifying a class directly?

我查看了以下代码的反汇编,发现两个测试函数的结果通常相同(或非常相似)。我想知道这两个功能之间有什么区别,如果没有,是否存在任何历史或原因?

struct test
{
    int x;

    test&      testfunction1()  { x++; return *this; }
    void       testfunction2()  { x++; }
};

编辑:我的问题得到这么快的回答,我现在想知道您选择使用其中一个而不是另一个的原因是什么?看来 'freedom' 应该始终使用引用而不是直接修改数据。

功能几乎相同,不同之处在于首先启用了链接方法的能力。这种设计模式称为fluent interface。它应该提供一个易于阅读、流畅的界面,通常模仿特定领域的语言。使用此模式生成的代码几乎可以像人类语言一样阅读。

Widget w = new Widget();
w.setHeight(1024).setWidth(768).setColor(255,0,0); // easy to follow

为什么人们不是到处都这样做? 这是组的偏好、可读性、编码约定的问题,以这种方式设计你需要更多的努力API。此外,如果您不使用返回值,则在使用某些标志编译 C++ 时可能会产生警告或错误 expression result is unused

testfunction1()示例的常见用法是使用输出的重载运算符,通常您可以在代码中看到

std::cout << "The results are: " << SomeUserDefinedStruct << " and "<< SomeUserDefinedStruct2 << std::endl;

operator<< 的重载版本正在返回对链接到其他链接的 std::ostream 的引用。