流上的运算符如何>>返回对自身的引用

how >> operator on streams returns a reference to itself

本文关键字:gt 引用 返回 运算符      更新时间:2023-10-16

假设我有一个类

class A{
A& operator+ (size_t ofst)
{
     //some calculation
     //return
}
};

这里我不能写

return this;

becuse A*无法转换为A&。那么如何做到这一点呢?我想返回引用而不是指针。


作为类比,存在>>或<lt;流类的运算符。正如我所知,这两个返回了对自身的引用。标准库是如何做到这一点的?

写入*this

一元*运算符执行解引用。因此,您从指针this开始,并应用*来获得它所指向的对象,即实际的底层对象。

*this的结果实际上不是一个引用,而是一个左值,然后它愉快地绑定到引用,该引用是函数/运算符的返回值。


至于流是如何实现的,大多数流的运营商过载都是非成员:

std::ostream& operator<<(std::ostream& os, const MyType& obj)
{
   os << obj.someStringRepresentationIGuess();
   return os;
}

未返回的将返回*this:

std::ostream& std::ostream::operator<<(int x)
{
    doSomethingToAddIntToBuffer(x);
    return *this;
}

这通常不适用于像+这样的运营商,尽管它适用于+=:

class A
{
   A operator+(size_t ofst)
   {
      A tmp = *this;
      tmp += ofst;
      return tmp;
   }
   A& operator+=(size_t ofst)
   {
      // some calculation
      return *this;
   }
};

这是因为+的约定适用于对象;否则,以下代码的结果将完全令人惊讶:

int x = 5;
int y = x + 2;
// is y 5 or 7?
// is x 5 or 7?
return *this;

沃伊拉

如果要将指针指定给引用,则必须取消对指针的引用。

您只需返回*this。除非成员函数本身是在null指针上调用的,否则它不会为null。