为什么有些类方法返回" * this" (自我的对象参考)?

时间:2016-04-12 11:08:31

标签: c++ this return-value

互联网上有大量的解释代码(特别是在这里,在stackoverflow上)返回*this

例如来自帖子Copy constructor and = operator overload in C++: is a common function possible?

MyClass& MyClass::operator=(const MyClass& other)
{
    MyClass tmp(other);
    swap(tmp);
    return *this;
}

当我把swap写为:

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

是否设置了operator =void的返回值并避免返回*this

3 个答案:

答案 0 :(得分:8)

这个成语存在以启用函数调用的链接:

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

这适用于int,所以没有必要让它不适用于用户定义的类型:)

与流运营商类似:

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

的作用相同
std::cout << "Hello, ";
std::cout << name;
std::cout << std::endl;

由于return *this成语,可以像第一个例子一样进行链接。

答案 1 :(得分:7)

返回*this以允许a = b = c;等分配链等同于b = c; a = b;的分配链的原因之一。通常,分配的结果可以在任何地方使用,例如,调用函数(f(a = b))或表达式(a = (b = c * 5) * 10)时。虽然,在大多数情况下,它只会使代码更复杂。

答案 2 :(得分:0)

当你强烈意识到你将在对象上调用相同的动作时,你会返回*this

例如,std::basic_string::append返回自身,因为有强烈的感觉,你想要追加另一个字符串

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

{p>同样适用于operator =

myObj1 = myObj2 = myObj3

swap没有这种强烈的感觉。表达式obj.swap(other).swap(rhs)似乎很常见吗?