返回引用和直接修改 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
的引用。
我查看了以下代码的反汇编,发现两个测试函数的结果通常相同(或非常相似)。我想知道这两个功能之间有什么区别,如果没有,是否存在任何历史或原因?
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
的引用。