关于c ++:为什么有些类方法返回“* this”(self的对象引用)?

Why do some class methods return “*this” (object reference of self)?

在互联网上(特别是在StackOverflow上)有很多代码可以解释,返回*this

例如,C++中的复制后构造函数和=操作符重载:可能是一个公共函数吗?:

1
2
3
4
5
6
MyClass& MyClass::operator=(const MyClass& other)
{
    MyClass tmp(other);
    swap(tmp);
    return *this;
}

当我写交换为:

1
2
3
4
void MyClass::swap( MyClass &tmp )
{
  // some code modifying *this i.e. copying some array of tmp into array of *this
}

设置operator =void的返回值是否不够,避免返回*this


这个成语用于实现函数调用的链接:

1
2
int a, b, c;
a = b = c = 0;

这对int很好,因此没有必要使它不适用于用户定义的类型:)

同样,对于流运算符:

1
std::cout <<"Hello," << name << std::endl;

工作原理与

1
2
3
std::cout <<"Hello,";
std::cout << name;
std::cout << std::endl;

由于return *this习惯用法,可以像第一个示例那样进行链接。


返回*this以允许类似于b = c; a = b;a = b = c;这样的分配链的原因之一。一般来说,赋值结果可以在任何地方使用,例如调用函数(f(a = b)或表达式(a = (b = c * 5) * 10时)。虽然,在大多数情况下,它只是使代码更加复杂。


当有强烈的感觉你将对对象调用相同的操作时,返回*this

例如,std::basic_string::append返回自身,因为有一种强烈的感觉,您将要附加另一个字符串

str.append("I have").append(std::to_string(myMoney)).append(" dollars");

同样适用于operator =

myObj1 = myObj2 = myObj3

swap没有这种强烈的感觉。表达obj.swap(other).swap(rhs)是否常见?