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?
- 你认为像a = b = c这样的链接任务是如何工作的?
- operator =的"正常"行为是返回对操作结果的引用。您可以将其定义为空,但它的行为与所有用户的期望不同。您不能简单地编写像(x=y)++或任何其他使用结果值的评估。重要的是返回对象的引用,而不是仅返回值。如果只返回值,上面的术语将编译,但结果是错误的!
- 这称为方法链接。相关:C++中的"返回"是什么意思?.
- 我认为这是一个很好的入门面试问题。
这个成语用于实现函数调用的链接:
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时)。虽然,在大多数情况下,它只是使代码更加复杂。
- 因此,在ifs;if (a = 5) ...)。经典的错误,由于这个特征。
- 这样的理解,好的,谢谢你
当有强烈的感觉你将对对象调用相同的操作时,返回*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)是否常见?