为什么有些类方法返回"*this"(self的对象引用)?

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

本文关键字:self 对象引用 类方法 返回 为什么 this      更新时间:2023-10-16
互联网

上有很多代码用于解释(也特别在这里,在stackoverflow上(返回*this

例如,从 post Copy 构造函数和 = 运算符重载 C++: 一个通用函数可能吗?

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

当我把交换写成:

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

operator = 的返回值设置为 void 并避免返回*this还不够吗?

这个习惯用法的存在是为了启用函数调用的链接:

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,可以像第一个例子一样链接。

返回

*this以允许像a = b = c;这样的赋值链的原因之一,它等同于b = c; a = b;。一般来说,赋值的结果可以在任何地方使用,例如在调用函数(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)似乎很常见吗?